创建通用 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 应用商店。 应用列表中的条目和可固定到开始菜单的主磁贴。 可以从“开始”菜单启动 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 控制台应用可以从运行它的目录(如下所示)访问文件系统。 这是可能的,因为模板将 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 控制台应用可能不使用后台任务,也不能用作后台任务。
  • 除了命令行激活之外,UWP 控制台应用不支持激活协定,包括文件关联、协议关联等。
  • 尽管 UWP 控制台应用支持多实例化,但它们不支持 多实例重定向
  • 有关可用于 UWP 应用的 Win32 API 的列表,请参阅 适用于 UWP 应用的 Win32 和 COM API