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

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

注意

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

从 Windows 10 版本 1803 开始,可编写在控制台窗口(如 DOS 或 PowerShell 控制台窗口)中运行的 C++/WinRT 或 C++/CX UWP 控制台应用。 控制台应用将控制台窗口用于输入和输出,并使用通用 C 运行时函数(例如 printf 和 getchar)。 UWP 控制台应用可以发布到 Microsoft Store。 它们在应用列表中有对应条目,并有可以固定到“开始”菜单的主要磁贴。 可以从“开始”菜单启动 UWP 控制台应用,但通常从命令行启动它们。

若要了解实际操作,请观看以下视频,了解创建 UWP 控制台应用的有关信息。

使用 UWP 控制台应用模板

若要创建 UWP 控制台应用,请首先安装 Visual Studio Marketplace中提供的控制台应用(通用)项目模板。 然后,安装的模板将作为“控制台应用 C++/WinRT(通用 Windows)”和“控制台应用 C++/CX(通用 Windows)”在“新建项目”>“已安装”>“其他语言”>“Visual C++”>“Windows 通用”下提供。

将代码添加到 main()

模板添加了 Program.cpp,其中包含 main() 函数。 这是 UWP 控制台应用中执行开始的位置。 使用 __argc__argv 形式参数访问命令行实际参数。 控制从 main() 返回时,UWP 控制台应用会退出。

以下 Program.cpp 示例由“控制台应用 C++/WinRT”模板添加:

#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 控制台应用可以从其运行的目录及其下方目录访问文件系统。 这是可能的,因为该模板向应用的 Package.appxmanifest 文件中添加了 AppExecutionAlias 扩展。 此扩展还使用户可以从控制台窗口中键入别名,以启动该应用。 该应用不需要在系统路径中启动。

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

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

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

<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 控制台应用可能不使用后台任务,也不会作为后台任务运行。
  • 命令行激活外,UWP 控制台应用不支持激活合约,包括文件关联、协议关联等。
  • 尽管 UWP 控制台应用支持多实例,但它们不支持多实例重定向
  • 有关适用于 UWP 应用的 Win32 API 的列表,请参阅适用于 UWP 应用的 Win32 和 COM API