桌面 PC 上带有本机消息传递的 MS Edge 扩展 - 运行 UWP 应用程序在后台/无 UI
MS Edge Extension with Native Messaging on Desktop PC - Run UWP App in Background / no UI
我们在 Windows 上有一个经典的桌面应用程序,它需要与网络浏览器通信。
因此,我们创建了 Web 浏览器扩展,并使用本机消息传递技术在网页上的 JavaScript 和本机桌面应用程序之间传递消息。
Google Chrome、Mozilla Firefox 和 Opera 目前支持这种通信方式。
现在我们要在 Microsoft Edge 中执行相同的任务。
但不幸的是,Microsoft Edge 以与其他浏览器不同的方式支持本地消息传递。
在 Chrome/Firefox/Opera 中,只需将序列化的 JSON 字符串通过 stdin/stdout.
传递给本地消息传递主机应用程序
由于 Microsoft Edge 是一个通用 Windows 平台应用程序,它仅支持通过 AppService 与另一个 UWP 应用程序通信(并进一步通过 FullTrustProcess 与我们的经典桌面应用程序通信)。
由于多种原因,我们的经典桌面应用无法转换为 UWP 应用。
基本上这没问题,但是有一些问题我目前不知道如何解决:
UWP 应用程序似乎需要用户界面。但是扩展的目的只是交流,没有 UI 的意图。
所以我可以在用户打开 UWP 应用程序时显示有关 UWP 应用程序/边缘扩展的一些信息,但如果用户关闭应用程序(例如通过单击 (X) 按钮),UWP 应用程序进程将被终止由系统。如果在通信过程中发生这种情况,则本机消息通信将中断,用户将收到错误消息。
到目前为止,我还没有找到避免这种情况的方法。
当 Microsoft Edge 启动 UWP 应用程序(由 "runtime.connectNative" 在扩展的后台 JavaScript 代码中启动)时,它在后台模式下运行,并且如果 Microsoft Edge 退出则终止,这是正常的。
但是,如果用户打开应用程序(例如通过开始菜单),应用程序的进程将被重用,并且现在 运行 处于前台模式。然后,如果应用 UI 被用户关闭,最初由 Microsoft Edge 启动的进程将终止。
我查看了 Microsoft 的官方 "ExtendedExecution" 示例,但它的行为方式相同。
- 如果用户关闭应用程序的 UI,是否有任何方法可以将 UWP 应用程序发送到后台模式执行而不是终止?以便应用程序可以像以前一样在后台模式下继续运行?
- 或者有没有办法在 OnLaunched 事件中隐藏 UI(例如,我们的经典桌面应用程序将打开,用户现在将无法再手动关闭 UWP 应用程序) ?
可能我可以从我们的本机桌面应用程序中找到 UWP 应用程序的 HWND 并用它执行一些丑陋的黑客攻击,但我绝对想避免这种情况。
此致,
多米尼克
uwp中有后台任务https://docs.microsoft.com/en-us/windows/uwp/launch-resume/support-your-app-with-background-tasks
此外,您会对 package.appxmanifest 文件中的此设置 'AppListEntry' 感兴趣。有了它,您的应用程序 link 将不会出现在开始菜单中
<Applications>
<Application Id="id" Executable="$targetnametoken$.exe" EntryPoint="entrypoint.App">
<uap:VisualElements AppListEntry="none" .../>
...
我们在 Windows 上有一个经典的桌面应用程序,它需要与网络浏览器通信。 因此,我们创建了 Web 浏览器扩展,并使用本机消息传递技术在网页上的 JavaScript 和本机桌面应用程序之间传递消息。 Google Chrome、Mozilla Firefox 和 Opera 目前支持这种通信方式。 现在我们要在 Microsoft Edge 中执行相同的任务。 但不幸的是,Microsoft Edge 以与其他浏览器不同的方式支持本地消息传递。 在 Chrome/Firefox/Opera 中,只需将序列化的 JSON 字符串通过 stdin/stdout.
传递给本地消息传递主机应用程序由于 Microsoft Edge 是一个通用 Windows 平台应用程序,它仅支持通过 AppService 与另一个 UWP 应用程序通信(并进一步通过 FullTrustProcess 与我们的经典桌面应用程序通信)。 由于多种原因,我们的经典桌面应用无法转换为 UWP 应用。 基本上这没问题,但是有一些问题我目前不知道如何解决:
UWP 应用程序似乎需要用户界面。但是扩展的目的只是交流,没有 UI 的意图。
所以我可以在用户打开 UWP 应用程序时显示有关 UWP 应用程序/边缘扩展的一些信息,但如果用户关闭应用程序(例如通过单击 (X) 按钮),UWP 应用程序进程将被终止由系统。如果在通信过程中发生这种情况,则本机消息通信将中断,用户将收到错误消息。 到目前为止,我还没有找到避免这种情况的方法。 当 Microsoft Edge 启动 UWP 应用程序(由 "runtime.connectNative" 在扩展的后台 JavaScript 代码中启动)时,它在后台模式下运行,并且如果 Microsoft Edge 退出则终止,这是正常的。 但是,如果用户打开应用程序(例如通过开始菜单),应用程序的进程将被重用,并且现在 运行 处于前台模式。然后,如果应用 UI 被用户关闭,最初由 Microsoft Edge 启动的进程将终止。 我查看了 Microsoft 的官方 "ExtendedExecution" 示例,但它的行为方式相同。
- 如果用户关闭应用程序的 UI,是否有任何方法可以将 UWP 应用程序发送到后台模式执行而不是终止?以便应用程序可以像以前一样在后台模式下继续运行?
- 或者有没有办法在 OnLaunched 事件中隐藏 UI(例如,我们的经典桌面应用程序将打开,用户现在将无法再手动关闭 UWP 应用程序) ?
可能我可以从我们的本机桌面应用程序中找到 UWP 应用程序的 HWND 并用它执行一些丑陋的黑客攻击,但我绝对想避免这种情况。
此致, 多米尼克
uwp中有后台任务https://docs.microsoft.com/en-us/windows/uwp/launch-resume/support-your-app-with-background-tasks
此外,您会对 package.appxmanifest 文件中的此设置 'AppListEntry' 感兴趣。有了它,您的应用程序 link 将不会出现在开始菜单中
<Applications>
<Application Id="id" Executable="$targetnametoken$.exe" EntryPoint="entrypoint.App">
<uap:VisualElements AppListEntry="none" .../>
...