Вызов схемы URL-адреса Windows для запущенной программы

Я хочу инициировать событие в моем работающем приложении и доставить аргументы с вызовом схемы URL в Windows 10. Я сделал следующую запись в реестре:

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? Я программирую это приложение в XOJO с объектно-ориентированным BASIC, но я буду рад общему решению.


person Robert Beier    schedule 28.07.2017    source источник
comment
Windows просто перезапускает исполняемый файл, поэтому ваш вопрос действительно заключается в том, как выполнять IPC в Windows. Я не знаю, что поддерживает ваш стек, но обычно это достигается за счет того, что exe пытается создать именованный мьютекс при загрузке, если он не может, он знает, что работает другой экземпляр самого себя, и в этот момент он использует механизм IPC, поэтому перенаправить свою командную строку, например, отправив по именованному каналу.   -  person Alex K.    schedule 28.07.2017
comment
Сделайте свое приложение единственным экземпляром (де-факто используется мьютекс) и отправьте сообщение из только что запущенного экземпляра в уже запущенный, а затем выйдите.   -  person CodeCaster    schedule 28.07.2017
comment
Спасибо Алексу и CodeCaster за то, что направили меня на правильный путь. С этой информацией я нашел хорошую статью с рабочим кодом и разместил ее в качестве ответа.   -  person Robert Beier    schedule 28.07.2017


Ответы (1)


Что ж, прочитав ответ Алекса, я поискал, как реализовать это с помощью кода, и нашел хорошо объясненный и работающий решение от Брэда Смита, написанное на C#.

Запись реестра выше может остаться как есть, но программе также необходимо:

  • Класс обслуживания (который предоставляется экземпляром приложения
    через удаленное взаимодействие .NET)
  • Измененная точка входа (которая либо связывается со службой, а затем завершает работу, либо запускает приложение в обычном режиме)

Прочитайте его статью и посмотрите на его код для дальнейшего объяснения.

person Robert Beier    schedule 28.07.2017