创建通用 Windows 平台控制台应用

本主题介绍如何创建 C++/WinRT 或 C++/CX 通用 Windows 平台(UWP)控制台应用。

注释

控制台应用(通用)项目模板扩展不支持 Visual Studio 2022。 安装并使用这些模板需要 Visual Studio 2017 或 Visual Studio 2019。

从 Windows 10 版本 1803 开始,可以编写在控制台窗口中运行的 C++/WinRT 或 C++/CX UWP 控制台应用,例如 DOS 或 PowerShell 控制台窗口。 控制台应用使用控制台窗口进行输入和输出,并且可以使用 通用 C 运行时 函数,例如 printfgetchar。 UWP 控制台应用可以发布到 Microsoft 应用商店。 他们在应用列表中有一个条目,并且有一个可以固定到“开始”菜单的主磁贴。 UWP 控制台应用可以从“开始”菜单启动,不过你通常会从命令行启动它们。

若想查看实际操作,这里有一个介绍如何创建 UWP 控制台应用的视频。

使用 UWP 控制台应用模板

若要创建 UWP 控制台应用,请先安装 控制台应用(通用)项目模板,可从 Visual Studio Marketplace获取。 然后,在新项目>安装>的其他语言>Visual C++>Windows 通用平台 中,可以找到已安装的模板,控制台应用C++/WinRT(通用 Windows 平台)控制台应用C++/CX(通用 Windows 平台)

将你的代码添加到 main()

模板添加了“Program.cpp”,其中包含了main()函数。 UWP 控制台应用的执行从此处开始。 使用 __argc__argv 参数访问命令行参数。 当控制权从 main()返回时,UWP 控制台应用退出。

Console App C++/WinRT 模板添加了以下 Program.cpp 示例:

#include "pch.h"

using namespace winrt;

// This example code shows how you could implement the required main function
// for a Console UWP Application. You can replace all the code inside main
// with your own custom code.

int __cdecl main()
{
    // You can get parsed command-line arguments from the CRT globals.
    wprintf(L"Parsed command-line arguments:\n");
    for (int i = 0; i < __argc; i++)
    {
        wprintf(L"__argv[%d] = %S\n", i, __argv[i]);
    }

    // Keep the console window alive in case you want to see console output when running from within Visual Studio
    wprintf(L"Press 'Enter' to continue: ");
    getchar();
}

UWP 控制台应用行为

UWP 控制台应用可以从其运行的目录及其下级目录访问文件系统。 这是可能的,因为模板将 AppExecutionAlias 扩展添加到应用的 Package.appxmanifest 文件。 此扩展还允许用户从控制台窗口键入别名以启动应用。 应用不需要位于要启动的系统路径中。

此外,您可以通过添加受限功能 broadFileSystemAccess 来为您的 UWP 控制台应用提供更广泛的文件系统访问权限,如 文件访问权限中所述。 此功能适用于 Windows.Storage 命名空间中的 API。

UWP 控制台应用的多个实例一次可以运行,因为模板将 SupportsMultipleInstances 功能添加到应用的 Package.appxmanifest 文件中。

该模板还会将 Subsystem="console" 功能添加到 Package.appxmanifest 文件,该文件表示此 UWP 应用是控制台应用。 请注意 desktop4 和 iot2 namespace 前缀。 UWP 控制台应用仅在桌面和物联网(IoT)项目上受支持。

<Package
  ...
  xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4" 
  xmlns:iot2="http://schemas.microsoft.com/appx/manifest/iot/windows10/2" 
  IgnorableNamespaces="uap mp uap5 desktop4 iot2">
  ...
  <Applications>
    <Application Id="App"
    ...
      desktop4:Subsystem="console" 
      desktop4:SupportsMultipleInstances="true" 
      iot2:Subsystem="console" 
      iot2:SupportsMultipleInstances="true"  >
      ...
      <Extensions>
          <uap5:Extension 
            Category="windows.appExecutionAlias" 
            Executable="YourApp.exe" 
            EntryPoint="YourApp.App">
            <uap5:AppExecutionAlias desktop4:Subsystem="console">
              <uap5:ExecutionAlias Alias="YourApp.exe" />
            </uap5:AppExecutionAlias>
          </uap5:Extension>
      </Extensions>
    </Application>
  </Applications>
    ...
</Package>

UWP 控制台应用的其他注意事项

  • 只有 C++/WinRT 和 C++/CX UWP 应用可能是控制台应用。
  • UWP 控制台应用必须面向桌面或 IoT 项目类型。
  • UWP 控制台应用可能无法创建窗口。 他们不能出于任何原因使用 MessageBox(、Location()或任何其他可能创建窗口的 API,例如用户同意提示。
  • UWP 控制台应用可能无法执行后台任务,也不能用作后台任务。
  • 除了 Command-Line 激活之外,UWP 控制台应用不支持激活协定,包括文件关联、协议关联等。
  • 尽管 UWP 控制台应用支持多实例化,但它们不支持 多实例重定向
  • 有关适用于 UWP 应用的 Win32 API 列表,请参阅适用于 UWP 应用的 Win32 和 COM API