Как я могу связать собственный протокол URL с приложением ClickOnce?
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
Этот модуль обрабатывает все кроссплатформенные вещи.