如何使用 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