¿Cómo ejecutar los comandos de proceso (o similares) usando una aplicación de la plataforma universal de Windows (UWP)?

Estoy trabajando en la creación de comandos de Cortana personalizados. Los comandos se registran y ejecutan utilizando una aplicación de plataforma universal de Windows. (GitHub)

Por ejemplo, he registrado el siguiente comando

 Shut down   

Para ejecutar esta función en una aplicación 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"); } 

Pero después de configurar esto, aprendí System.Diagnostics.Process no es compatible con UWP.

Los comandos personalizados que deseo ejecutar implican algún tipo de ejecución, como iniciar progtwigs externos, ejecutar otros scripts o abrir sitios web.

Tiene sentido que UWP no los soporte dado que es universal y un Xbox o un teléfono podría no ser capaz de hacer esto, pero esperaba que hubiera alguna forma alternativa o chiflada de lograr esto en una PC con Windows 10.

¿Hay alguna forma de ejecutar comandos de Process u otra cosa con funcionalidades similares en una aplicación UWP? Parece que aunque puedo hacer que Cortana ejecute mi código C #, UWP no admite mucho que sea útil en esta situación.

Gracias por adelantado.

Hay – formas limitadas de lograr un comportamiento similar.

  1. Puede usar LaunchUri para activar otras aplicaciones que se registraron para un determinado URI-Scheme. Esto debería funcionar para su escenario webbrowser. Más detalles aquí: https://msdn.microsoft.com/en-us/library/windows/apps/windows.system.launcher.launchuriasync.aspx

  2. Puede activar otra aplicación y obtener resultados con LaunchForResults. La aplicación llamada tiene que ser compatible con esto. Más detalles aquí: https://msdn.microsoft.com/en-us/library/windows/apps/mt269386.aspx

  3. Puede desencadenar servicios de aplicaciones proporcionados por otra aplicación. La aplicación llamada tiene que ser compatible con esto. El servicio de la aplicación se ejecutará en segundo plano. (Creo que esto es genial.) Más detalles aquí: http://blogs.msdn.com/b/mvpawardprogram/archive/2015/06/11/writing-windows-10-app-services-in-javascript.aspx

  4. Esto es un poco raro: no estoy seguro de si esto todavía funciona, pero sí funcionó para Windows 8.1: podría crear un llamado “Componente corregido”. Esto le permite activar todo desde su aplicación en su máquina, pero no podrá publicar un componente intermediario en la tienda. Esto también permitió Process.Start () en Windows 8.1. Solo funcionó para aplicaciones de carga lateral. No estoy seguro de si todavía funciona en Windows 10. Más información aquí: https://msdn.microsoft.com/en-us/library/windows/apps/dn630195.aspx

Resumen: iniciar otra aplicación es bastante fácil siempre que la aplicación de destino se haya registrado como servicio de aplicación o haya registrado un controlador de protocolo (esquema de Uri). Iniciar scripts u otro * .exe es imposible si la opción 4 ya no funciona.

Con Windows 10 Anniversary Update (1607) existe una opción para habilitar este escenario en PC. Con esta API en Desktop Extension SDK, puede iniciar un proceso de plena confianza que se ejecute con todos los privilegios de usuario:

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

De esta forma puede iluminarlo en las plataformas donde es compatible, es decir, PC con 1607 o superior. Y tu aplicación seguirá siendo universal:

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