从今天早上开始,我一直在尝试这样做,但似乎对我没有用。
要求是让用户调用cortana并要求她打开一个应用程序-我们将其称为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行并停在那里。 调试窗口符合预期-没用。
现在,我尝试使用在某处阅读的另一种完全不同的技术,它包括将应用程序本地添加到user \ programs \文件夹,然后说“打开app1”从Cortana调用它。
问题是,Cortana根本无法识别该应用程序。它只是启动Edge并在bing上搜索app1。
我看过一些有关cortana技能的视频,其中一些视频是使用uwp应用程序完成的,从而启动了一个新应用程序-但是我的实际上是一个使用auto-py-to-exe从python生成的exe文件,因此对我没用。
参考: https://www.youtube.com/watch?v=h2L9KAWh5qs&t=2696s https://www.youtube.com/watch?v=6imjt5l7jXc
是否有解决此问题的方法?
答案 0 :(得分:1)
之所以在本地而不是在部署时起作用,是因为您的代码在运行代码的任何计算机上(服务器端)而不是在与您的代码进行交互的人的计算机上(客户端)执行Process.Start()
。在本地测试时,服务器和客户端是同一台机器;部署时并非如此。
有可能在有限的基础上完成您想要的。
阅读文档Launch apps or websites from a Cortana skill。
当前,Cortana supports a single action: LaunchUri
。因此,要启动一个应用程序,该应用程序必须必须具有与其相关联的uri协议。
例如,要启动使用bingmaps:
协议的Windows Map App,请使用(注意:我的示例使用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);
如果您需要访问非UWP应用,则必须在注册表中的本地计算机上register your own URI scheme:
your-protocol-name/ (Default) "URL:your-protocol-name Protocol" URL Protocol "" shell/ open/ command/ (Default) PathToExecutable