Расширение MS Edge с собственной системой обмена сообщениями на настольном ПК - запуск приложения UWP в фоновом режиме / без пользовательского интерфейса
У нас есть классическое настольное приложение для Windows, которое должно взаимодействовать с веб-браузерами. Поэтому мы создали расширения для веб-браузера и используем собственную технологию обмена сообщениями для передачи сообщений между JavaScript на веб-странице и собственным настольным приложением. Этот способ общения в настоящее время поддерживается в Google Chrome, Mozilla Firefox и Opera. Теперь мы хотим выполнить ту же задачу в Microsoft Edge. Но, к сожалению, Microsoft Edge поддерживает собственные сообщения другим способом, чем другие браузеры. В Chrome/Firefox/Opera просто сериализованная строка JSON может быть передана в собственное хост-приложение обмена сообщениями через stdin/stdout.
Поскольку Microsoft Edge является универсальным приложением на платформе Windows, он поддерживает только связь с другим приложением UWP через AppService (и дальнейшую связь с нашим классическим настольным приложением через FullTrustProcess). Наше классическое настольное приложение не может быть преобразовано в приложение UWP по многим причинам. В принципе, это не проблема, но есть некоторые проблемы, которые я в настоящее время не знаю, как решить:
Приложения UWP, похоже, требуют пользовательского интерфейса. Но целью расширения является только связь, пользовательский интерфейс не предназначен.
Таким образом, я мог бы отобразить некоторую информацию о приложении UWP / Edge Extension, когда пользователь открывает приложение UWP, но если пользователь закрывает приложение (например, нажав кнопку (X)), процесс приложения UWP уничтожается системой. Если это происходит во время процесса обмена данными, исходный обмен сообщениями прерывается, и пользователь получает сообщение об ошибке. Пока я не нашел способ избежать этого. Когда Microsoft Edge запускает приложение UWP (инициированное "runtime.connectNative" в фоновом коде JavaScript расширения), оно запускается в фоновом режиме и будет остановлено, если Microsoft Edge завершит работу, что в порядке. Но если пользователь открывает приложение (например, через меню "Пуск"), процесс для приложения используется повторно, и теперь он работает в режиме переднего плана. И затем, если пользовательский интерфейс приложения закрыт, процесс, который изначально был запущен Microsoft Edge, будет прерван. Я посмотрел на официальный пример "ExtendedExecution" от Microsoft, но он ведет себя так же.
- Есть ли способ отправить приложение UWP в фоновый режим вместо завершения, если пользователь закрывает пользовательский интерфейс приложения? Чтобы приложение продолжало работать в фоновом режиме, как раньше?
- Или есть ли способ скрыть пользовательский интерфейс в событии OnLaunched (например, тогда наше классическое настольное приложение будет открыто, и пользователь больше не сможет вручную закрывать приложение UWP)?
Возможно, я смогу найти HWND приложения UWP в нашем родном настольном приложении и выполнить с ним некрасивые хаки, но я определенно хочу этого избежать.
С уважением, Доминик
1 ответ
В uwp есть фоновые задачи https://docs.microsoft.com/en-us/windows/uwp/launch-resume/support-your-app-with-background-tasks
Также вас заинтересует этот параметр 'AppListEntry' в файле package.appxmanifest. При этом ссылка на ваше приложение не появится в меню "Пуск"
<Applications>
<Application Id="id" Executable="$targetnametoken$.exe" EntryPoint="entrypoint.App">
<uap:VisualElements AppListEntry="none" .../>
...