我如何无缝和离散地将新的 URI 启动参数传递给 Windows 中的当前 运行 应用程序?
How can I seamlessly and discretely communicate new URI launch parameters to a currently running application in Windows?
案例: 在浏览器中单击 URL,用户桌面上当前 运行 的视频游戏可以提取该数据并执行某些操作。
我已经为此工作了一段时间,但我不知道我是否走在正确的道路上。
我目前拥有的:
网页中的可点击 URI,可以有不同的参数供客户端接收。
URI 方案在 Windows 中注册。在浏览器中单击 URI 时,它将启动已安装在用户 PC 上的 c++ 控制台 'launcher' 或 'bridge' 应用程序。
'launcher' 是一个 middle-man,它解析 URI 参数并通过 IPC 命名管道将它们传送到主 'user' 应用程序(视频游戏)。
我如何:
在 UX 方面,使整个过程离散且无缝?
具体来说,我需要:
对用户隐藏启动器 - 否 pop-up。
需要只能够 运行 单个实例,即使在使用新的 URI 参数调用时也是如此。我是否只是退出当前并创建一个新的?
用户可以单击网页中的另一个 URI,启动器将处理新参数而不向用户显示自己。
技术限制:
Windows。
最好需要是 C++。 C# 可能是一种可能性。
现有例子:
Zoom 会议软件的工作原理与此类似。
在浏览器中单击 URL 会启动 'launcher',从而启动主应用程序进行视频会议。
关闭 'launcher' 会将其最小化到系统托盘中。
在启动器处于 运行 时单击新的 link 不会启动新的启动器,但会启动新的会议。
这样的事情通常如何运作?
OS 自动为 /SUBSYSTEM:CONSOLE 应用程序创建一个控制台。它不会自动为 /SUBSYSTEM:WINDOWS 创建 window。所以使用 /SUBSYSTEM:WINDOWS.
然后,在创建主管道window之前创建命名管道。
如果 return 代码告诉你创建了一个新管道(使用 FILE_FLAG_FIRST_PIPE_INSTANCE
),你是主实例,创建 main window 和 运行 通常,在命名管道上进行 OVERLAPPED 读取以接收来自未来调用的数据。
如果您打开的是现有的命名管道,请通过命名管道编写命令行并退出,而无需创建 window.
您根本不需要单独的启动器,实际上将启动器与主应用程序分开会产生竞争条件(第二个启动器在第一个实例设法启动主程序之前启动/在主程序运行之前启动up 和 运行ning,没有看到现有的命名管道,并认为它是主副本)。您最好将 argument-forwarding 逻辑的两边都放入主可执行文件中。
案例: 在浏览器中单击 URL,用户桌面上当前 运行 的视频游戏可以提取该数据并执行某些操作。
我已经为此工作了一段时间,但我不知道我是否走在正确的道路上。
我目前拥有的: 网页中的可点击 URI,可以有不同的参数供客户端接收。 URI 方案在 Windows 中注册。在浏览器中单击 URI 时,它将启动已安装在用户 PC 上的 c++ 控制台 'launcher' 或 'bridge' 应用程序。 'launcher' 是一个 middle-man,它解析 URI 参数并通过 IPC 命名管道将它们传送到主 'user' 应用程序(视频游戏)。
我如何: 在 UX 方面,使整个过程离散且无缝?
具体来说,我需要: 对用户隐藏启动器 - 否 pop-up。 需要只能够 运行 单个实例,即使在使用新的 URI 参数调用时也是如此。我是否只是退出当前并创建一个新的? 用户可以单击网页中的另一个 URI,启动器将处理新参数而不向用户显示自己。
技术限制: Windows。 最好需要是 C++。 C# 可能是一种可能性。
现有例子: Zoom 会议软件的工作原理与此类似。 在浏览器中单击 URL 会启动 'launcher',从而启动主应用程序进行视频会议。 关闭 'launcher' 会将其最小化到系统托盘中。 在启动器处于 运行 时单击新的 link 不会启动新的启动器,但会启动新的会议。
这样的事情通常如何运作?
OS 自动为 /SUBSYSTEM:CONSOLE 应用程序创建一个控制台。它不会自动为 /SUBSYSTEM:WINDOWS 创建 window。所以使用 /SUBSYSTEM:WINDOWS.
然后,在创建主管道window之前创建命名管道。
如果 return 代码告诉你创建了一个新管道(使用
FILE_FLAG_FIRST_PIPE_INSTANCE
),你是主实例,创建 main window 和 运行 通常,在命名管道上进行 OVERLAPPED 读取以接收来自未来调用的数据。如果您打开的是现有的命名管道,请通过命名管道编写命令行并退出,而无需创建 window.
您根本不需要单独的启动器,实际上将启动器与主应用程序分开会产生竞争条件(第二个启动器在第一个实例设法启动主程序之前启动/在主程序运行之前启动up 和 运行ning,没有看到现有的命名管道,并认为它是主副本)。您最好将 argument-forwarding 逻辑的两边都放入主可执行文件中。