Подтвердить что ты не робот

Как выполнить команды процесса (или аналогичные) с помощью приложения Universal Windows Platform (UWP)?

Я работаю над созданием пользовательских команд Cortana. Команды регистрируются и выполняются с использованием универсального приложения Windows Platform. (GitHub)

Например, я зарегистрировал следующую команду

<Command Name="ShutDown">      
  <ListenFor>Shut down</ListenFor>
  <Navigate/>    
</Command>

Чтобы запустить эту функцию в приложении UWP

static async void ShutDown()
{
    var dialog = new MessageDialog("This is where I would shut the computer down.");
    await dialog.ShowAsync();
    //System.Diagnostics.Process.Start("Shutdown", "-s -t 10");
}

Но после установки этого вопроса я узнал, что System.Diagnostics.Process не поддерживается в UWP.

Пользовательские команды, которые я хочу запустить, включают какое-то исполнение, например запуск внешних программ, запуск других скриптов или открытие веб-сайтов.

Имеет смысл, что UWP не поддерживает их, учитывая, что он универсален, а XBox или телефон не могут это сделать, но я надеялся, что есть какой-то альтернативный или хакерский способ сделать это на ПК с Windows 10.

Есть ли способ выполнить команды Process или что-то еще с аналогичной функциональностью в приложении UWP? Кажется, что даже если я могу заставить Cortana выполнить мой код на С#, UWP не поддерживает многое, что было бы полезно в этой ситуации.

Спасибо заранее.

4b9b3361

Ответ 1

Существуют ограниченные способы достижения аналогичного поведения.

  • Вы можете использовать LaunchUri для запуска других приложений, которые зарегистрированы для определенной URI-схемы. Это должно работать для вашего сценария веб-браузера. Подробнее здесь: https://msdn.microsoft.com/en-us/library/windows/apps/windows.system.launcher.launchuriasync.aspx

  • Вы можете запустить другое приложение и получить результаты от него с помощью LaunchForResults. Вызываемое приложение должно поддерживать это. Подробнее здесь: https://msdn.microsoft.com/en-us/library/windows/apps/mt269386.aspx

  • Вы можете запускать службы приложений, предоставляемые другим приложением. Вызываемое приложение должно поддерживать это. Служба приложения будет выполнена в фоновом режиме. (Я думаю, что это довольно круто.) Подробнее здесь: http://blogs.msdn.com/b/mvpawardprogram/archive/2015/06/11/writing-windows-10-app-services-in-javascript.aspx

  • Это немного взломано: я не уверен, что это все еще работает, но оно работает для Windows 8.1: вы можете создать так называемый "Брокерский компонент". Это позволяет вам запускать все, что угодно, от вашего приложения на вашем компьютере, но вы не сможете опубликовать брокерский компонент в магазине. Это также позволило Process.Start() в Windows 8.1. Он работал только для загруженных приложений. Я не уверен, что он все еще работает в Windows 10. Подробнее здесь: https://msdn.microsoft.com/en-us/library/windows/apps/dn630195.aspx

Резюме: Запуск другого приложения довольно прост, пока целевое приложение зарегистрировано как приложение или зарегистрировано обработчик протокола (схема Uri). Запуск сценариев или другого *.exe невозможно, если опция 4 больше не работает.

Ответ 2

В обновлении Windows 10 Anniversary Update (1607) есть возможность включить этот сценарий на ПК. С помощью этого API в SDK Desktop Extension вы можете запустить полнопроцессный процесс, который выполняется с полными полномочиями пользователя:

https://docs.microsoft.com/en-us/uwp/api/Windows.ApplicationModel.FullTrustProcessLauncher

Таким образом, вы можете осветить его на платформах, на которых он поддерживается, то есть на ПК с 1607 или выше. И ваше приложение будет по-прежнему универсальным:

if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
{
    await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
}