Как открыть локальное приложение, используя навыки Cortana - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь сделать это с утра, и, похоже, это не работает для меня.

Требуется, чтобы пользователь вызвал Кортану и попросил ее открыть приложение - назовем его app1.

Я создал лазурного бота на основе EchoBot и заменил код ответа следующим:

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. Но он не работает при вызове из Кортаны.

Редактировать : локальное тестирование выполнено с использованием эмулятора Bot Framework (v4)

Он просто печатает строку «Открытие приложения 1» и стоит там. Окно отладки, как и ожидалось, бесполезно.

Теперь я попытался использовать совершенно другую технику, которую я где-то читал, она заключается в локальном добавлении приложения в папку user \ Programs \ и вызове его из Cortana, сказав Open app1.

Проблема в том, что Кортана вообще не распознает приложение. он просто запускает Edge и ищет app1 на bing.

Я видел несколько видео, касающихся навыка cortana, и в некоторых из них запуск нового приложения с использованием готового приложения uwp - но мой на самом деле exe-файл, сгенерированный из python с использованием auto-py-to-exe, так что это не полезно для меня.

Ссылка: https://www.youtube.com/watch?v=h2L9KAWh5qs&t=2696s https://www.youtube.com/watch?v=6imjt5l7jXc

Есть ли решение этой проблемы?

1 Ответ

1 голос
/ 18 июня 2019

Причина, по которой это работает локально, а не при развертывании, заключается в том, что ваш код выполняет Process.Start() на любой машине, на которой выполняется код (на стороне сервера), а не на машине человека, взаимодействующего с вашим кодом (на стороне клиента). При локальном тестировании сервер и клиент - это один и тот же компьютер; не так при развертывании.

Возможно, на ограниченной основе, выполнить то, что вы хотите.

Прочитайте документацию, Запустите приложения или веб-сайты из навыка Cortana .

В настоящее время Кортана поддерживает одно действие: LaunchUri. Итак, чтобы запустить приложение, приложение должно иметь связанный с ним протокол URI.

Например, для запуска приложения Windows Map App, которое использует протокол bingmaps:, вы должны использовать (Примечание. В моем примере используется код 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, вам нужно зарегистрировать свою собственную схему URI на локальном компьютере в реестре:

  your-protocol-name/
    (Default)    "URL:your-protocol-name Protocol"
    URL Protocol ""
    shell/
      open/
        command/
          (Default) PathToExecutable




...