如何使用 Cortana 技能打开本地应用程序
How to open a local application using Cortana skills
我从今天早上开始就一直在尝试这样做,但它似乎对我不起作用。
要求是让用户调用 cortana ana 要求她打开一个应用程序 - 我们称它为 app1。
我创建了一个基于 EchoBot 的 azure 机器人,并将应答代码替换为:
protected override async Task
OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext,
CancellationToken cancellationToken)
{
await turnContext.SendActivityAsync(MessageFactory.Text($"Echo:
Opening app1..."), cancellationToken);
var startInfo = new ProcessStartInfo
{
FileName = @"D:\_Projects\xyz\app1.exe",
UseShellExecute = false,
CreateNoWindow = false,
};
var process = Process.Start(startInfo);
var success = process != null && process.WaitForExit(30 * 10000);
if (!success)
{
//process?.Kill();
throw new ApplicationException("A timeout occurred during
method execution. The service interface did not finish in a
timely fashion.");
}
var exitCode = process.ExitCode;
}
从 Azure 下载代码后在本地执行时, 可以工作。
但是从 Cortana 调用时它不起作用。
编辑:使用 Bot Framework Emulator (v4) 完成本地测试
它只是打印 Opening App1 行并停在那里。
调试 window 符合预期 - 没用。
现在我尝试使用我在某处读到的完全不同的技术,它包括将应用程序本地添加到 user\programs\ 文件夹,然后通过说“打开应用程序 1”从 Cortana 调用它。
问题是,Cortana 根本无法识别该应用程序。它只是启动 Edge 并在 bing.
上搜索 app1
我看过一些关于 cortana 技能的视频,其中一些视频使用 done using a uwp 应用程序启动了一个新的应用程序 - 但我的实际上是一个使用 auto-py 从 python 生成的 exe- to-exe 所以这对我没用。
参考资料:
https://www.youtube.com/watch?v=h2L9KAWh5qs&t=2696s
https://www.youtube.com/watch?v=6imjt5l7jXc
这个问题有解决办法吗?
这在本地而不是在部署时起作用的原因是因为您的代码 Process.Start()
在 运行 代码(服务器端)的任何机器上执行,而不是在与您交互的人的机器上执行代码(客户端)。本地测试时,server和client是同一台机器;部署时不是这样。
有可能在有限的基础上实现您想要的。
阅读文档,Launch apps or websites from a Cortana skill。
目前,Cortana supports a single action: LaunchUri
。因此,要启动一个应用程序,该应用程序 必须 有一个与之关联的 uri 协议。
例如,要启动使用 bingmaps:
协议的 Windows 地图应用程序,您可以使用(注意:我的示例使用 Bot Framework V4 代码,而我链接的文档使用 V3) :
var message = MessageFactory.Text("Launching app...");
message.ChannelData = JObject.FromObject(new {
action = new { type = "LaunchUri", uri = "bingmaps:?where=Paris"}
});
await context.SendActivityAsync(message);
如果您需要访问 non-UWP 应用程序,您必须 register your own URI scheme 在注册表中的本地计算机上:
your-protocol-name/
(Default) "URL:your-protocol-name Protocol"
URL Protocol ""
shell/
open/
command/
(Default) PathToExecutable
我从今天早上开始就一直在尝试这样做,但它似乎对我不起作用。
要求是让用户调用 cortana ana 要求她打开一个应用程序 - 我们称它为 app1。
我创建了一个基于 EchoBot 的 azure 机器人,并将应答代码替换为:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: Opening app1..."), cancellationToken); var startInfo = new ProcessStartInfo { FileName = @"D:\_Projects\xyz\app1.exe", UseShellExecute = false, CreateNoWindow = false, }; var process = Process.Start(startInfo); var success = process != null && process.WaitForExit(30 * 10000); if (!success) { //process?.Kill(); throw new ApplicationException("A timeout occurred during method execution. The service interface did not finish in a timely fashion."); } var exitCode = process.ExitCode; }
从 Azure 下载代码后在本地执行时, 可以工作。 但是从 Cortana 调用时它不起作用。
编辑:使用 Bot Framework Emulator (v4) 完成本地测试
它只是打印 Opening App1 行并停在那里。 调试 window 符合预期 - 没用。
现在我尝试使用我在某处读到的完全不同的技术,它包括将应用程序本地添加到 user\programs\ 文件夹,然后通过说“打开应用程序 1”从 Cortana 调用它。
问题是,Cortana 根本无法识别该应用程序。它只是启动 Edge 并在 bing.
上搜索 app1我看过一些关于 cortana 技能的视频,其中一些视频使用 done using a uwp 应用程序启动了一个新的应用程序 - 但我的实际上是一个使用 auto-py 从 python 生成的 exe- to-exe 所以这对我没用。
参考资料: https://www.youtube.com/watch?v=h2L9KAWh5qs&t=2696s https://www.youtube.com/watch?v=6imjt5l7jXc
这个问题有解决办法吗?
这在本地而不是在部署时起作用的原因是因为您的代码 Process.Start()
在 运行 代码(服务器端)的任何机器上执行,而不是在与您交互的人的机器上执行代码(客户端)。本地测试时,server和client是同一台机器;部署时不是这样。
有可能在有限的基础上实现您想要的。
阅读文档,Launch apps or websites from a Cortana skill。
目前,Cortana supports a single action: LaunchUri
。因此,要启动一个应用程序,该应用程序 必须 有一个与之关联的 uri 协议。
例如,要启动使用 bingmaps:
协议的 Windows 地图应用程序,您可以使用(注意:我的示例使用 Bot Framework V4 代码,而我链接的文档使用 V3) :
var message = MessageFactory.Text("Launching app...");
message.ChannelData = JObject.FromObject(new {
action = new { type = "LaunchUri", uri = "bingmaps:?where=Paris"}
});
await context.SendActivityAsync(message);
如果您需要访问 non-UWP 应用程序,您必须 register your own URI scheme 在注册表中的本地计算机上:
your-protocol-name/ (Default) "URL:your-protocol-name Protocol" URL Protocol "" shell/ open/ command/ (Default) PathToExecutable