自動啟動 Windows 10 UWP 應用
原文: https://docs.microsoft.com/zh-cn/windows/uwp/xbox-apps/automate-launching-uwp-apps
簡介
開發人員有多種選項可用於實現自動啟動通用 Windows 平臺 (UWP) 應用。 在本文中,我們將探討通過使用協議激活和啟動激活來啟動應用的方法。
協議激活允許應用根據給定協議將自身註冊為處理程序。
啟動激活是正常的應用啟動,例如從應用磁貼啟動。
通過每個激活方法,你可以選擇使用命令行或啟動器應用程序。 對於所有的激活方法,如果應用當前正在運行,激活會將應用顯示到前臺(這將重新激活它)並提供新的激活參數。 這允許靈活使用激活命令向應用提供新消息。 請務必註意,需要針對激活方法編譯和部署項目才能運行新更新的應用。
協議激活
按照以下步驟來設置適用於應用的協議激活:
- 在 Visual Studio 中打開 Package.appxmanifest 文件。
- 選擇“聲明”****選項卡。
- 在“可用聲明”*下拉列表中,選擇“協議”,然後選擇“添加”***。
-
在“屬性”*下的“名稱”*字段中,輸入唯一名稱以啟動應用。
-
保存文件並部署項目。
- 在部署項目後,應設置協議激活。
- 轉到“控制面板”\“所有控制面板項”\“默認程序”*,然後選擇“將文件類型或協議與特定程序關聯”
現在設置了協議激活,你可以通過兩個選項(命令行或啟動器應用程序)使用協議激活應用。
命令行
可以通過使用命令行(命令啟動後跟之前設置的協議名稱、冒號(“:”)以及任何參數)來協議激活應用。 這些參數可以是任意字符串;但是,為了充分利用統一資源標識符 (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。
獲取程序包系列名稱的最佳方法是完成以下步驟:
- 打開 Package.appxmanifest 文件。
-
在“打包”*選項卡上,輸入“程序包名稱”*。
-
如果“程序包系列名稱”*未列出,請打開 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 應用。 根據要求和使用情況,可能還有更適合的其他方法。
自動啟動 Windows 10 UWP 應用