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

Я работаю над созданием пользовательских команд Кортаны. Команды регистрируются и выполняются с помощью приложения универсальной платформы Windows. (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? Похоже, что даже несмотря на то, что я могу заставить Кортану выполнить мой код C #, UWP не поддерживает много полезного в этой ситуации.

Заранее спасибо.


person Charles Clayton    schedule 25.11.2015    source источник
comment
UWP поддерживает использование WMI, если да, то сделайте это с помощью WMI   -  person MethodMan    schedule 25.11.2015
comment
@MethodMan Спасибо за идею, стоило проверить. К сожалению, похоже, что WMI тоже не поддерживается. Вот что я имею в виду, я думал, что регистрация и выполнение команд будет сложной частью, я не понимал, что C # будет настолько ограничен в UWP.   -  person Charles Clayton    schedule 25.11.2015
comment
облом. Microsoft хочет больше приложений, но они крепче связывают нам руки. Я хочу отправить команду доверенному процессу приложения - в чем дело ?? Атакует человек посередине? Разработчик может отправлять и получать json из приложения на сервер, почему бы не из приложения в приложение?   -  person ezaspi    schedule 27.02.2017


Ответы (2)


Есть - ограниченные - способы добиться подобного поведения.

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

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

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

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

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

person Daniel Meixner    schedule 25.11.2015
comment
Спасибо за ваш ответ! Я попробую некоторые из них сегодня вечером. - person Charles Clayton; 25.11.2015
comment
Кто-нибудь пробовал использовать AppService для выключения или перезагрузки планшета? Кажется, я не могу найти способ сделать это. - person Sam; 13.11.2016
comment
В этом документе говорится, что вариант 4 по-прежнему можно использовать в Windows 10, однако его нельзя опубликовать в обычном потребительском Магазине Windows. docs.microsoft.com/en-us/windows/uwp/winrt-components/ - person Ch.Idea; 02.12.2018

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

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

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

if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
{
    await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
}
person Stefan Wick MSFT    schedule 16.05.2017
comment
Но если я воспользуюсь этим, я все равно могу опубликовать свое приложение в магазине? - person Sieg; 01.02.2018
comment
Да в общем можно. Вам нужно будет пройти процесс публикации настольного приложения, который будет включать в себя ознакомительную проверку вашего приложения, поскольку оно имеет возможность полного доверия. Вы можете начать этот процесс здесь: developer.microsoft.com/ ru-us / windows / projects / campaign / - person Stefan Wick MSFT; 01.02.2018