建立通用 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 執行時間 函式,例如 printfgetchar。 UWP 控制台應用程式可以發佈至 Microsoft Store。 他們在應用程式清單中有一個專案,以及可釘選到開始功能表 的主要磚。 UWP 控制台應用程式可以從開始功能表 啟動,不過您通常會從命令行啟動它們。

若要查看作用中的影片,以下是關於建立 UWP 控制台應用程式的影片。

使用 UWP 主控台應用程式範本

若要建立 UWP 控制台應用程序,請先安裝 Visual Studio Marketplace 中提供的控制台應用程式 (通用) 專案範本。 然後,已安裝的範本可在>新專案已安裝>其他語言> Visual C++>Windows Universal 下作為控制台應用程式 C++/WinRT (通用 Windows) 和控制台應用程式 C++/CX (通用 Windows) 使用。

將程式碼加入 main()

範本會新增 Program.cpp,其中包含 main() 函式。 這是 UWP 主控台應用程式中開始執行的位置。 使用 __argc__argv 參數存取命令行自變數。 當控件從 main() 傳回時,UWP 控制台應用程式會結束。

主控台應用程式 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 控制台應用程式可能不會取用背景工作,也不能做為背景工作。
  • 除命令列啟動外,UWP 控制台應用程式不支援啟動合約,包括檔案關聯、協定關聯等。
  • 儘管 UWP 控制台應用支援多執行個體,但它們不支援多執行個體重定向
  • 如需適用於 UWP app 的 Win32 API 清單,請參閱 適用於 UWP 應用程式的 Win32 和 COM API