如何将自定义URL协议与ClickOnce应用程序相关联?

时间:2011-09-07 13:13:20

标签: clickonce protocol-handler custom-url-protocol

我想将自定义URL协议(例如,myprotocol://SomeFolder/SomePage)与ClickOnce应用相关联。

我可以毫无问题地创建关联 - 问题是每次更新应用程序(经常)时,EXE文件的路径都会发生变化。

有没有解决这个问题的方法?

4 个答案:

答案 0 :(得分:4)

似乎答案是你不能,但我确实提出了解决方案。

我创建了一个启动器(非常简单的应用程序),它找到了快捷方式并将其启动参数传递给ClickOnce应用程序。我需要以传统方式安装启动器,但主应用程序仍然可以在需要时通过ClickOnce进行更新。

我发现这些链接很有用:

答案 1 :(得分:0)

安装完应用程序后,系统会在开始菜单中创建一个链接。该链接实际上是一个扩展名为“appref-ms”的文件。因此,诀窍是注册一个协议,使用“appref-ms”打开应用程序。

因此,当您的ClickOnce应用程序启动时,您可以创建以下注册表项来注册您的协议。    HKEY_CLASSES_ROOT        myprotocol = {协议说明}        贝壳            打开                command = explorer%1

就是这样。现在有人会点击像myprotocol这样的网址:XXX你的应用程序将被打开并将作为“ClickOnce”应用程序打开,以便检查是否有新版本等等。

答案 2 :(得分:0)

如果您尝试ClickOnce已将相应的密钥添加到HKCR,则只需要没有所需的URL协议值。我将此代码添加到应用程序逻辑的开头:

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

答案 3 :(得分:-1)

我为此制作了一个 npm 模块。

Here 是链接。

因此,要在 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

这个模块处理所有跨平台的东西。