天天看點

自動啟動 Windows 10 UWP 應用

原文: https://docs.microsoft.com/zh-cn/windows/uwp/xbox-apps/automate-launching-uwp-apps

簡介

開發人員有多種選項可用于實作自動啟動通用 Windows 平台 (UWP) 應用。 在本文中,我們将探讨通過使用協定激活和啟動激活來啟動應用的方法。

協定激活允許應用根據給定協定将自身注冊為處理程式。

啟動激活是正常的應用啟動,例如從應用磁貼啟動。

通過每個激活方法,你可以選擇使用指令行或啟動器應用程式。 對于所有的激活方法,如果應用目前正在運作,激活會将應用顯示到前台(這将重新激活它)并提供新的激活參數。 這允許靈活使用激活指令向應用提供新消息。 請務必注意,需要針對激活方法編譯和部署項目才能運作新更新的應用。

協定激活

按照以下步驟來設定适用于應用的協定激活:

  1. 在 Visual Studio 中打開 Package.appxmanifest 檔案。
  2. 選擇“聲明”****頁籤。
  3. 在“可用聲明”*下拉清單中,選擇“協定”,然後選擇“添加”***。
  4. 在“屬性”*下的“名稱”*字段中,輸入唯一名稱以啟動應用。
    自動啟動 Windows 10 UWP 應用
  5. 儲存檔案并部署項目。
  6. 在部署項目後,應設定協定激活。
  7. 轉到“控制台”\“所有控制台項”\“預設程式”*,然後選擇“将檔案類型或協定與特定程式關聯”。 滾動到“協定”***部分,檢視協定是否列出。

現在設定了協定激活,你可以通過兩個選項(指令行或啟動器應用程式)使用協定激活應用。

指令行

可以通過使用指令行(指令啟動後跟之前設定的協定名稱、冒号(“:”)以及任何參數)來協定激活應用。 這些參數可以是任意字元串;但是,為了充分利用統一資源辨別符 (URI) 功能,建議遵循标準的 URI 格式:

複制

scheme://username:password@host:port/path.extension?query#fragment
           

Uri 對象有分析此格式的 URI 字元串的方法。 有關詳細資訊,請參閱 

Uri 類 (MSDN)

示例:

>start bingnews:
>start myapplication:protocol-parameter
>start myapplication://single-player/level3?godmode=1&ammo=200
           

協定指令行激活在原始 URI 上最多支援 2038 個 Unicode 字元。

啟動器應用程式

若要啟動,請單獨建立一個支援 WinRT API 的應用程式。 以下示例中顯示了啟動程式中用于通過協定激活啟動的 C++ 代碼,其中 PackageURI 是适用于具有任何參數的應用程式的 URI;例如 

myapplication:

 或 

myapplication:protocol activation arguments

bool ProtocolLaunchURI(Platform::String^ URI)
{
       IAsyncOperation<bool>^ protocolLaunchAsyncOp;
       try
       {
              protocolLaunchAsyncOp = Windows::System::Launcher::LaunchUriAsync(ref new 
Uri(URI));
       }
       catch (Platform::Exception^ e)
       {
              Platform::String^ dbgStr = "ProtocolLaunchURI Exception Thrown: " 
+ e->ToString() + "\n";
              OutputDebugString(dbgStr->Data());
              return false;
       }

       concurrency::create_task(protocolLaunchAsyncOp).wait();

       if (protocolLaunchAsyncOp->Status == AsyncStatus::Completed)
       {
              bool LaunchResult = protocolLaunchAsyncOp->GetResults();
              Platform::String^ dbgStr = "ProtocolLaunchURI " + URI 
+ " completed. Launch result " + LaunchResult + "\n";
              OutputDebugString(dbgStr->Data());
              return LaunchResult;
       }
       else
       {
              Platform::String^ dbgStr = "ProtocolLaunchURI " + URI + " failed. Status:" 
+ protocolLaunchAsyncOp->Status.ToString() + " ErrorCode:" 
+ protocolLaunchAsyncOp->ErrorCode.ToString() + "\n";
              OutputDebugString(dbgStr->Data());
              return false;
       }
}
           

啟動器應用程式的協定激活與指令行的協定激活具有相同的參數限制。 二者在原始 URI 上都最多支援 2038 個 Unicode 字元。

啟動激活

你還可以通過使用啟動激活來啟動應用。 不需要進行設定,但需要 UWP 應用的應用程式使用者模型 ID (AUMID)。 AUMID 是程式包系列名稱,後跟一個感歎号和應用程式 ID。

擷取程式包系列名稱的最佳方法是完成以下步驟:

  1. 打開 Package.appxmanifest 檔案。
  2. 在“打包”*頁籤上,輸入“程式包名稱”*。
    自動啟動 Windows 10 UWP 應用
  3. 如果“程式包系列名稱”*未列出,請打開 PowerShell 并運作 

    >get-appxpackage MyPackageName

     來查找 *PackageFamilyName。

在 

<Applications>

 元素下的 Package.appxmanifest 檔案(在 XML 視圖中打開)中可找到應用程式 ID。

用于執行 UWP 應用啟動激活的工具随 Windows 10 SDK 一起安裝。 該工具可以從指令行運作,并且它會将應用的 AUMID 作為一個參數啟動。

C:\Program Files (x86)\Windows Kits\10\App Certification Kit\microsoft.windows.softwarelogo.appxlauncher.exe <AUMID>
           

它看起來如下所示:

CMD指令:

"C:\Program Files (x86)\Windows Kits\10\App Certification Kit\microsoft.windows.softwarelogo.appxlauncher.exe" MyPackageName_ph1m9x8skttmg!AppId
           

此選項不支援指令行參數。

C#代碼: Process.Start(new ProcessStartInfo(@"C:\Program Files (x86)\Windows Kits\10\App Certification Kit\microsoft.windows.softwarelogo.appxlauncher.exe", "acad3bbc-56cd-47d1-9aff-a8ef2e7ad58f_75cr2b68sm664!AppId"));                             

你可以單獨建立一個支援使用 COM 的應用程式以用于啟動。 以下示例顯示啟動程式中用于通過啟動激活啟動的 C++ 代碼。 使用此代碼,你可以建立 ApplicationActivationManager 對象并調用傳入之前查找的 AUMID 的 ActivateApplication 和任何參數。 有關其他參數的詳細資訊,請參閱 

IApplicationActivationManager::ActivateApplication 方法 (MSDN)
#include <ShObjIdl.h>
#include <atlbase.h>

HRESULT LaunchApp(LPCWSTR AUMID)
{
     HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
     if (FAILED(hr))
     {
            wprintf(L"LaunchApp %s: Failed to init COM. hr = 0x%08lx \n", AUMID, hr);
     }
     {
            CComPtr<IApplicationActivationManager> AppActivationMgr = nullptr;
            if (SUCCEEDED(hr))
            {
                   hr = CoCreateInstance(CLSID_ApplicationActivationManager, nullptr,  
CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&AppActivationMgr));
                   if (FAILED(hr))
                   {
                         wprintf(L"LaunchApp %s: Failed to create Application Activation 
Manager. hr = 0x%08lx \n", AUMID, hr);
                   }
            }
            if (SUCCEEDED(hr))
            {
                   DWORD pid = 0;
                   hr = AppActivationMgr->ActivateApplication(AUMID, nullptr, AO_NONE, 
&pid);
                   if (FAILED(hr))
                   {
                         wprintf(L"LaunchApp %s: Failed to Activate App. hr = 0x%08lx 
\n", AUMID, hr);
                   }
            }
     }
     CoUninitialize();
     return hr;
}
           

值得注意的是,與前面的啟動方法(即,使用指令行)不同,此方法支援傳入的參數。

接受參數

若要在激活 UWP 應用時接受傳入的參數,必須向該應用添加一些代碼。 若要确定進行的是協定激活還是啟動激活,請替代 OnActivated 事件,并檢查參數類型,然後擷取原始字元串或 Uri 對象的預分析的值。

此示例介紹如何擷取原始字元串。

void OnActivated(IActivatedEventArgs^ args)
{
        // Check for launch activation
        if (args->Kind == ActivationKind::Launch)
        {
            auto launchArgs = static_cast<LaunchActivatedEventArgs^>(args);    
Platform::String^ argval = launchArgs->Arguments;
            // Manipulate arguments …
        }

        // Check for protocol activation
        if (args->Kind == ActivationKind::Protocol)
        {
            auto protocolArgs = static_cast< ProtocolActivatedEventArgs^>(args);
            Platform::String^ argval = protocolArgs->Uri->ToString();
            // Manipulate arguments …
        }
    }
           

摘要

總之,你可以使用各種方法來啟動 UWP 應用。 根據要求和使用情況,可能還有更适合的其他方法。

繼續閱讀