我想将自定义URL协议(例如,myprotocol://SomeFolder/SomePage
)与ClickOnce应用相关联。
我可以毫无问题地创建关联 - 问题是每次更新应用程序(经常)时,EXE文件的路径都会发生变化。
有没有解决这个问题的方法?
答案 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
这个模块处理所有跨平台的东西。