visual tutorial studio example español app c# visual-studio uwp windows-10 win-universal-app cortana

c# - tutorial - visual studio



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

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

Por ejemplo, he registrado el siguiente comando

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

Para ejecutar esta función en una aplicación para 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 quiero ejecutar implican algún tipo de ejecución, como iniciar programas externos, ejecutar otros scripts o abrir sitios web.

Tiene sentido que UWP no los admita, ya que es universal y es posible que una XBox o un teléfono no puedan hacer esto, pero esperaba que hubiera alguna forma alternativa o extravagante de lograr esto en una PC con Windows 10.

¿Hay alguna manera de ejecutar comandos de Process o algo más con una funcionalidad similar en una aplicación para UWP? Parece que aunque puedo hacer que Cortana ejecute mi código C #, UWP no admite mucho que sería útil en esta situación.

Gracias por adelantado.


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

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

De esta manera, 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(); }


Hay formas limitadas de lograr un comportamiento similar.

  1. Puede usar LaunchUri para activar otras aplicaciones que se registraron para un determinado esquema URI. Esto debería funcionar para su escenario de navegador web. 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 de ella utilizando LaunchForResults. La aplicación llamada tiene que soportar esto. Más detalles aquí: https://msdn.microsoft.com/en-us/library/windows/apps/mt269386.aspx

  3. Puede activar los Servicios de aplicaciones proporcionados por otra aplicación. La aplicación llamada tiene que soportar 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 hacky: no estoy seguro de si esto todavía funciona, pero funcionó para Windows 8.1: podría crear un llamado "Componente Brokered". Esto le permite activar todo desde su aplicación en su máquina, pero no podrá publicar un componente negociado en la tienda. Esto también permitió Process.Start () en Windows 8.1. Solo funcionó para aplicaciones cargadas de lado. 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 aplicaciones o haya registrado un controlador de protocolo (esquema Uri). Iniciar scripts u otro * .exe es imposible si la opción 4 ya no funciona.