如何在 Windows 中注册自定义 URL 协议?
Posted
技术标签:
【中文标题】如何在 Windows 中注册自定义 URL 协议?【英文标题】:How do I register a custom URL protocol in Windows? 【发布时间】:2010-09-09 23:42:03 【问题描述】:如何在 Windows 中注册自定义协议,以便在单击电子邮件或网页中的链接时打开我的应用程序并将 URL 中的参数传递给它?
【问题讨论】:
how do I create my own URL protocol? (e.g. so://...)的可能重复 【参考方案1】:转到Start
,然后在Find
中输入regedit
-> 它应该打开Registry editor
在HKEY_CLASSES_ROOT
上单击鼠标右键 然后New
-> Key
-
在 Key 中给出您希望调用 url 的小写名称(在我的情况下它将是
testus://sdfsdfsdf
)然后在 testus
上单击 Right Mouse -> 然后 New
-> String Value
并添加 URL Protocol
没有值。
-
然后像使用协议一样添加更多条目( Right Mouse
New
-> Key
)并创建像 testus
-> shell
-> open
-> 这样的层次结构command
和内部command
将(Default)
更改为您要启动的.exe
的路径,如果您想将参数传递给您的exe 然后将路径包装到""
中的exe 并添加 "%1"
以查看喜欢:"c:\testing\test.exe" "%1"
-
要测试它是否有效,请转到
Internet Explorer
(不是Chrome
或Firefox
)并输入testus:have_you_seen_this_man
这应该会触发您的.exe
(给您一些提示,您想这样做 - 说是)并传递给 args testus://have_you_seen_this_man
。
这是要测试的示例控制台应用程序:
using System;
namespace Testing
class Program
static void Main(string[] args)
if (args!= null && args.Length > 0)
Console.WriteLine(args[0]);
Console.ReadKey();
希望这可以为您节省一些时间。
【讨论】:
哇,这东西好用。不仅在 IE 上,而且在 Chrome 上! 在 C# 中有什么方法可以做到这一点?像安装程序...? @MatasVaitkevicius 我可以在注册表中指定“应用程序运行的工作目录”(在自定义 URL 协议条目中)。前任。如果我创建自定义 Url 注册表项来触发批处理文件,无论批处理文件的位置如何,当从浏览器启动时,批处理文件都会从 system32 运行,而如果我通过双击运行批处理文件,则工作目录仍然存在它的当前目录。 @user1066231 superuser.com/questions/396394/… ? @MatasVaitkevicius 谢谢。是的,找到了答案。在这里发帖-可能对其他人有用。 ***.com/questions/68577785/…【参考方案2】:MSDN 链接很好,但那里的安全信息不完整。处理程序注册应包含“%1”,而不是 %1。这是一种安全措施,因为某些 URL 源在调用您的自定义协议处理程序之前会错误地解码 %20。
PS。您将获得整个 URL,而不仅仅是 URL 参数。但是除了已经提到的 %20->space 转换之外,URL 可能会受到一些虐待。在您的 URL 语法设计中保持保守会有所帮助。不要随意乱扔 // 否则你会陷入 file:// 的混乱。
【讨论】:
你所说的“文件://”到底是什么意思? 没有正式的文件映射:URL 到本地路径。对于使用两个或三个前导斜杠,或者当路径引用 Windows 目录时使用正斜杠还是反斜杠,甚至没有达成共识。 迟到的评论,我知道。但是是否也可以在没有协议处理程序的情况下以某种方式仅访问 URL 参数? 这听起来像是一个单独的问题。不过,请务必直截了当。协议处理程序是接收 URL 的程序。 “没有协议处理程序”就没有人解析 URL 和访问 URL 参数。 @WiiLF:正确,注册表将其视为REG_SZ
。在内部,Windows 不解析命令行,因此也保留了空格。但是任何解析命令行的语言运行时(例如 C 的 argv[]
parsing)都会在未加引号的空格处中断。【参考方案3】:
为此目的有一个 npm 模块。
链接:https://www.npmjs.com/package/protocol-registry
所以要在 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
它还支持所有其他操作系统。
【讨论】:
以上是关于如何在 Windows 中注册自定义 URL 协议?的主要内容,如果未能解决你的问题,请参考以下文章