【问题标题】:Windows URL scheme call to running programWindows URL 方案调用正在运行的程序
【发布时间】:2017-07-28 11:50:40
【问题描述】:

我想在我正在运行的应用程序中触发一个事件,并通过在 Windows 10 中调用 URL 方案来传递参数。 我做了以下注册表项:

HKEY_CLASSES_ROOT
alert
    (Default) = "URL:Alert Protocol"
    URL Protocol = ""
    DefaultIcon
        (Default) = "alert.exe,1"
    shell
        open
            command
                (Default) = "C:\Program Files\Alert\alert.exe" "%1"

显然,在调用“alert:arg1”时,这总是会使用参数启动我的应用程序的新实例。但我希望 Windows 调用我已经运行的实例。

对于 Mac,这个 URL 方案的调用触发了一个事件,我可以捕捉到。正是,如我所愿。为此,我在 alert.app/Contents/Info.plist 中添加了以下部分:

<array>
  <dict>
    <key>CFBundleURLName</key>
    <string>Alert</string>
    <key>CFBundleURLSchemes</key>
    <array>
            <string>alert</string>
    </array>
  </dict>
</array>

那么我如何在 Windows 上实现这一点?我正在使用面向对象的 BASIC 在 XOJO 中编写这个应用程序,但我会很高兴有一个通用的解决方案。

【问题讨论】:

  • Windows 只是重新启动可执行文件,所以您的问题实际上是“如何在 Windows 上执行 IPC”。我不知道你的堆栈支持什么,但这通常是通过让 exe 在加载时尝试创建一个命名互斥锁来完成的,如果它不能知道它自己的另一个实例正在运行,此时它使用 IPC 机制所以转发其命令行,例如通过命名管道发送。
  • 使您的应用程序成为单实例(事实上的方式是使用互斥锁)并将消息从新启动的实例发送到已经运行的实例,然后退出。
  • 感谢 Alex 和 CodeCaster 带领我走上正确的道路。有了这些信息,我找到了一篇带有工作代码的好文章并将其发布为答案。

标签: windows ipc url-scheme xojo


【解决方案1】:

好吧,在阅读了 Alex 的答案后,我搜索了如何用代码实现这一点,并找到了一个用 C# 编写的 Brad Smith 的解释良好且有效的solution

上面的注册表项可以保持原样,但程序还需要:

  • 服务类(由应用程序实例公开
    通过 .NET 远程处理)
  • 修改后的入口点(将与服务通信然后终止,或正常启动应用程序)

阅读他的文章并查看他的代码以获得进一步的解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2017-02-10
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多