Как я могу связать собственный протокол URL с приложением ClickOnce?

Я хочу связать пользовательский протокол URL (например, myprotocol://SomeFolder/SomePage) с помощью приложения ClickOnce.

Я могу создать ассоциацию без проблем - проблема в том, что каждый раз, когда приложение обновляется (что часто), путь к файлу EXE изменяется.

Есть ли способ обойти эту проблему?

4 ответа

Решение

Кажется, ответ на это вы не можете, однако я нашел решение.

Я создал модуль запуска (очень простое приложение), который находит ярлык и передает его параметры запуска в приложение ClickOnce. Мне нужно установить лаунчер традиционным способом, но при необходимости основное приложение все еще может быть обновлено через ClickOnce.

Я нашел эти ссылки полезными:

После установки приложения создайте ссылку в меню "Пуск". Ссылка на самом деле является файлом с расширением "appref-ms". Итак, хитрость заключается в том, чтобы зарегистрировать протокол, который будет использовать "appref-ms" для открытия приложения.

Итак, когда вы запускаете приложение ClickOnce, вы можете создать следующую запись в реестре, чтобы зарегистрировать свой протокол. HKEY_CLASSES_ROOT myprotocol = {Описание протокола} команда открытия оболочки = проводник%1

Вот и все. Теперь, когда кто-то щелкнет по URL-адресу, например, myprotocol: XXX, ваше приложение откроется и откроется как приложение "ClickOnce", чтобы оно проверило, есть ли новая версия и так далее.

Если вы пытаетесь, чтобы ClickOnce уже добавил соответствующий ключ в HKCR, просто без требуемого значения URL Protocol. Я добавил этот код в начало логики моего приложения:

try
{
    RegistryKey rk = Registry.ClassesRoot.OpenSubKey("MyProgramName", true);
    rk.SetValue("URL Protocol", "");
}
catch (Exception ex)
{ 
    // handle, log, etc.
}

Который работал хорошо, потому что это то, что я хотел, чтобы URL-протокол ссылался (например, "MyProgramName://....". Я смог сделать это успешно без моего приложения, обладающего правами администратора - возможно, это потребовалось бы, если бы я пытался зарегистрировать другой обработчик, хотя, так что YMMV. По крайней мере, просмотр значения там должен дать вам идея о том, как правильно запустить приложение.

Вот ключ реестра, который был создан по умолчанию:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\MyAppName]
@="Electronic Data Interchange (EDI) File"
"AppId"="MyAppName.application, Culture=neutral, PublicKeyToken=31fc6d113f9bb401, processorArchitecture=msil"
"DeploymentProviderUrl"="file://server/share/MyAppName/MyAppName.application"
"Guid"="{MY_APP_GUID}"

[HKEY_CLASSES_ROOT\MyAppName\shell]
@="open"

[HKEY_CLASSES_ROOT\MyAppName\shell\open]

[HKEY_CLASSES_ROOT\MyAppName\shell\open\command]
@="rundll32.exe dfshim.dll, ShOpenVerbExtension {MY_APP_GUID} %1"

[HKEY_CLASSES_ROOT\MyAppName\shellex]

[HKEY_CLASSES_ROOT\MyAppName\shellex\IconHandler]
@="{MY_APP_GUID}"

И код, который я разместил, просто добавляет URL Protocol с пустым значением под MyAppName узел.

Для этого я сделал модуль npm.

Вот ссылка.

Итак, чтобы сделать это в nodejs, вам просто нужно запустить код ниже:

Сначала установите это

      npm i protocol-registry

Затем используйте приведенный ниже код, чтобы зарегистрировать входной файл.

      const path = require('path');

const ProtocolRegistry = require('protocol-registry');

console.log('Registering...');
// Registers the Protocol
ProtocolRegistry.register({
    protocol: 'testproto', // sets protocol for your command , testproto://**
    command: `node ${path.join(__dirname, './index.js')} $_URL_`, // $_URL_ will the replaces by the url used to initiate it
    override: true, // Use this with caution as it will destroy all previous Registrations on this protocol
    terminal: true, // Use this to run your command inside a terminal
    script: false
}).then(async () => {
    console.log('Successfully registered');
});

Тогда предположим, что кто-то открывает testproto://test тогда будет запущен новый терминал, выполняющий:

      node yourapp/index.js testproto://test

Этот модуль обрабатывает все кроссплатформенные вещи.

Другие вопросы по тегам