创建通用 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