Automate launching Windows 10 UWP apps (Автоматизация запуска приложений UWP для Windows 10)
Введение
Разработчики имеют несколько вариантов для автоматического запуска приложений универсальная платформа Windows (UWP). В этом документе мы рассмотрим методы запуска приложения с помощью активации протокола и запуска активации.
Активация протокола позволяет приложению зарегистрировать себя в качестве обработчика для заданного протокола.
Активация запуска — это обычный запуск приложения, например запуск с плитки приложения.
При каждом методе активации вы можете использовать командную строку или приложение средства запуска. Для всех методов активации, если приложение запущено в данный момент, активация приведет приложение к переднему плану (который повторно активирует его) и предоставит новые аргументы активации. Это позволяет гибко использовать команды активации для предоставления новых сообщений приложению. Важно отметить, что проект необходимо скомпилировать и развернуть для метода активации для запуска обновленного приложения.
Активация протокола
Выполните следующие действия, чтобы настроить активацию протокола для приложений:
Откройте файл Package.appxmanifest в Visual Studio.
Выберите вкладку "Объявления".
В раскрывающемся списке "Доступные объявления" выберите "Протокол" и нажмите кнопку "Добавить".
В разделе "Свойства" в поле "Имя" введите уникальное имя для запуска приложения.
Сохраните файл и разверните проект.
После развертывания проекта необходимо установить активацию протокола.
Перейдите к панель управления\All панель управления Items\Default Program и выберите "Связать тип файла или протокол" с определенной программой. Прокрутите страницу до раздела "Протоколы" , чтобы узнать, указан ли протокол.
Теперь, когда активация протокола настроена, у вас есть два варианта (приложение командной строки или средства запуска) для активации приложения с помощью протокола.
Командная строка
Приложение может быть активировано протоколом с помощью командной строки с командой, за которой следует набор имен протокола ранее, двоеточие (":"), а также любые параметры. Параметры могут быть любой произвольной строкой; Однако для использования возможностей универсального идентификатора ресурса (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
Активация командной строки протокола поддерживает символы Юникода до ограничения 2038 символов в необработанном URI.
Приложение средства запуска
Для запуска создайте отдельное приложение, которое поддерживает API WinRT. Код C++ для запуска с активацией протокола в программе запуска показан в следующем примере, где URI пакета является универсальным кодом ресурса (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;
}
}
Активация протокола с помощью приложения средства запуска имеет те же ограничения для аргументов, что и активация протокола с помощью командной строки. Оба поддерживают символы Юникода до ограничения в 2038 символов в необработанном универсальном коде ресурса (URI).
Запуск активации
Вы также можете запустить приложение с помощью активации запуска. Настройка не требуется, но требуется идентификатор пользовательской модели приложения (AUMID) приложения UWP. AUMID — это имя семейства пакетов, за которым следует восклицательный знак и идентификатор приложения.
Лучший способ получить имя семейства пакетов — выполнить следующие действия:
Откройте файл Package.appxmanifest.
На вкладке "Упаковка" введите имя пакета.
Если имя семейства пакетов не указано, откройте PowerShell и выполните команду
>get-appxpackage MyPackageName
, чтобы найти PackageFamilyName.
Идентификатор приложения можно найти в файле Package.appxmanifest (открытом в xml-представлении) в элементе <Applications>
.
Командная строка
Средство для выполнения активации запуска приложения UWP устанавливается с помощью пакета SDK для Windows 10. Его можно запустить из командной строки, и он принимает 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 и вызвать АктивациюApplication , передаваемую ранее и любые аргументы AUMID. Дополнительные сведения о других параметрах см. в разделе "Метод 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. В зависимости от требований и вариантов использования различные методы могут быть лучше подходят, чем другие.