web-dev-qa-db-fra.com

Comment exécuter des commandes de processus (ou similaires) à l'aide d'une application de plateforme Windows universelle (UWP)?

Je travaille sur la création de commandes Cortana personnalisées. Les commandes sont enregistrées et exécutées à l'aide d'une application de plateforme Windows universelle. (GitHub)

Par exemple, j'ai enregistré la commande suivante

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

Pour exécuter cette fonction dans une application 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");
}

Mais après avoir configuré cela, j'ai appris System.Diagnostics.Process n'est pas pris en charge dans UWP.

Les commandes personnalisées que je veux exécuter impliquent une sorte d'exécution telle que le lancement de programmes externes, l'exécution d'autres scripts ou l'ouverture de sites Web.

Il est logique que l'UWP ne les prenne pas en charge, car il est universel et une XBox ou un téléphone pourrait ne pas être en mesure de les faire, mais j'espérais qu'il y avait une autre façon ou une méthode hacky pour y parvenir sur un PC Windows 10.

Existe-t-il un moyen pour moi d'exécuter des commandes Process ou autre chose avec des fonctionnalités similaires dans une application UWP? Il semble que même si je peux demander à Cortana d'exécuter mon code C #, UWP ne prend pas en charge beaucoup de choses qui seraient utiles dans cette situation.

Merci d'avance.

25
Charles Clayton

Il existe des moyens - limités - de parvenir à un comportement similaire.

  1. Vous pouvez utiliser LaunchUri pour déclencher d'autres applications qui se sont inscrites pour un certain schéma URI. Cela devrait fonctionner pour votre scénario de navigateur Web. Plus de détails ici: https://msdn.Microsoft.com/en-us/library/windows/apps/windows.system.launcher.launchuriasync.aspx

  2. Vous pouvez déclencher une autre application et en obtenir des résultats à l'aide de LaunchForResults. L'application appelée doit prendre en charge cela. Plus de détails ici: https://msdn.Microsoft.com/en-us/library/windows/apps/mt269386.aspx

  3. Vous pouvez déclencher les services d'application fournis par une autre application. L'application appelée doit prendre en charge cela. Le service d'application sera exécuté en arrière-plan. (Je pense que c'est assez cool.) Plus de détails ici: http://blogs.msdn.com/b/mvpawardprogram/archive/2015/06/11/writing-windows-10-app-services-in -javascript.aspx

  4. C'est un peu hacky: je ne sais pas si cela fonctionne toujours, mais cela a fonctionné pour Windows 8.1: vous pouvez créer un soi-disant "composant Brokered". Cela vous permet de tout déclencher depuis votre application sur votre machine, mais vous ne pourrez pas publier un composant négocié dans le magasin. Cela a également permis Process.Start () sur Windows 8.1. Cela ne fonctionnait que pour les applications latérales. Je ne sais pas si cela fonctionne toujours sous Windows 10. Plus d'informations ici: https://msdn.Microsoft.com/en-us/library/windows/apps/dn630195.aspx

Résumé: Le démarrage d'une autre application est assez facile tant que l'application cible est enregistrée en tant que service d'application ou enregistre un gestionnaire de protocole (schéma Uri). Le démarrage de scripts ou d'autres * .exe est impossible si l'option 4 ne fonctionne plus.

19
Daniel Meixner

Avec la mise à jour anniversaire de Windows 10 (1607), il existe une option pour activer ce scénario sur PC. Avec cette API dans le SDK Desktop Extension, vous pouvez lancer un processus de confiance totale qui s'exécute avec les privilèges utilisateur complets:

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

De cette façon, vous pouvez l'allumer sur les plates-formes où il est pris en charge, c'est-à-dire les PC exécutant 1607 ou supérieur. Et votre application sera toujours universelle:

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