自動化啟動 Windows 10 UWP 應用程式
簡介
開發人員有多種選擇來實現通用 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應用程式的應用程式使用者模型識別碼 (AUMID)。 AUMID 是套件系列名稱,後面接著驚嘆號和應用程式標識碼。
取得套件系列名稱的最佳方式是完成下列步驟:
開啟 Package.appxmanifest 檔案。
在封包索引標籤上,輸入封包名稱。
如果未列出套件系列名稱,請開啟 PowerShell 並執行
>get-appxpackage MyPackageName
以尋找 PackageFamilyName。
應用程式 ID 可以在 <Applications>
元素下的 Package.appxmanifest 檔案 (在 XML 檢視中開啟) 中找到。
命令列
執行UWP app啟動啟用的工具會隨 Windows 10 SDK 一起安裝。 它可以從命令行執行,並接受應用程式的 AUMID 作為自變數啟動。
C:\Program Files (x86)\Windows Kits\10\App Certification Kit\microsoft.windows.softwarelogo.appxlauncher.exe <AUMID>
它可能看起來像這樣:
"C:\Program Files (x86)\Windows Kits\10\App Certification Kit\microsoft.windows.softwarelogo.appxlauncher.exe" MyPackageName_ph1m9x8skttmg!AppId
選項不支援命令列引數。
啟動器應用程式
您可以建立個別的應用程式,支援使用 COM 來啟動。 下列範例示範在啟動器程式中使用啟動啟用啟動的 C++ 程式碼。 使用此程式碼,您可以建立一個 ApplicationActivationManager 物件並呼叫 ActivateApplication,傳入先前找到的 AUMID 和任何參數。 如需其他參數的詳細資訊,請參閱 IApplicationActivationManager::ActivateApplication method (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 應用程式。 根據要求和用例,不同的方法可能比其他方法更適合。