如何使用通用Windows平台(UWP)应用程序执行流程命令(或类似)?

Cha*_*ton 26 c# win-universal-app cortana windows-10 uwp

我正在努力创建自定义Cortana命令.使用通用Windows平台应用程序注册和执行命令.(GitHub的)

例如,我已经注册了以下命令

<Command Name="ShutDown">      
  <ListenFor>Shut down</ListenFor>
  <Navigate/>    
</Command>
Run Code Online (Sandbox Code Playgroud)

在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");
}
Run Code Online (Sandbox Code Playgroud)

但是在设置之后System.Diagnostics.Process,UWP不支持我学到的东西.

我想运行的自定义命令涉及某种执行,例如启动外部程序,运行其他脚本或打开网站.

UWP不支持它们是有意义的,因为它是通用的,XBox或手机可能无法做到这些,但我希望在Windows 10 PC上有一些替代或黑客的方法来实现这一点.

我有办法Process在UWP应用程序中执行命令或具有类似功能的其他东西吗?似乎即使我可以让Cortana执行我的C#代码,UWP也不支持在这种情况下有用的东西.

提前致谢.

Dan*_*ner 20

有 - 有限 - 实现类似行为的方法.

  1. 您可以使用LaunchUri触发注册特定URI-Scheme的其他应用程序.这适用于您的webbrowser场景.更多细节: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. 您可以触发另一个应用程序提供的App Services.被叫应用程序必须支持这一点.应用服务将在后台执行.(我觉得这很酷.)更多详情请点击这里:http://blogs.msdn.com/b/mvpawardprogram/archive/2015/06/11/writing-windows-10-app-services-in-javascript.aspx

  4. 这有点hacky:我不确定这是否仍然有效,但它确实适用于Windows 8.1:你可以创建一个所谓的"Brokered Component".这允许您从机器上的应用程序触发所有内容,但是您将无法将代理组件发布到商店中.这也允许Windows 8.1上的Process.Start().它只适用于侧载应用程序.我不确定它是否仍适用于Windows 10.更多信息请访问:https://msdn.microsoft.com/en-us/library/windows/apps/dn630195.aspx

简介:只要目标应用程序注册为app服务或注册协议处理程序(Uri方案),启动另一个应用程序就非常简单.如果选项4不再起作用,则无法启动脚本或其他*.exe.


Ste*_*SFT 10

使用Windows 10周年更新(1607),可以选择在PC上启用此方案.使用Desktop Extension SDK中的此API,您可以启动以完全用户权限运行的完整信任进程:

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

这样,您可以在支持它的平台上点亮它,即运行1607或更高版本的PC.你的应用程序仍然是通用的:

if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
{
    await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
}
Run Code Online (Sandbox Code Playgroud)