如何使用Cortana技能打开本地应用程序

时间:2019-06-18 15:39:06

标签: c# botframework cortana processstartinfo

从今天早上开始,我一直在尝试这样做,但似乎对我没有用。

要求是让用户调用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

是否有解决此问题的方法?

1 个答案:

答案 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