繁体   English   中英

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

[英]How to execute Process commands (or similar) using a Universal Windows Platform (UWP) App?

我正在创建自定义 Cortana 命令。 这些命令是使用通用 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");
}

但是在设置之后我了解到 UWP 不支持System.Diagnostics.Process

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

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

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

提前致谢。

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

  1. 您可以使用 LaunchUri 来触发注册了某个 URI-Scheme 的其他应用程序。 这应该适用于您的网络浏览器场景。 更多详细信息: 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:您可以创建一个所谓的“代理组件”。 这允许您从您机器上的应用程序触发所有内容,但您将无法将代理组件发布到商店中。 这也允许 Windows 8.1 上的 Process.Start()。 它仅适用于旁加载的应用程序。 我不确定它是否仍然适用于 Windows 10。更多信息在这里: https : //msdn.microsoft.com/en-us/library/windows/apps/dn630195.aspx

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

在 Windows 10 周年更新 (1607) 中,有一个选项可以在 PC 上启用此方案。 使用 Desktop Extension SDK 中的此 API,您可以启动以完全用户权限运行的 fulltrust 进程:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM