如何在Windows中注册自定义URL协议?

155

如何在Windows中注册自定义协议,以便在电子邮件或网页中单击链接时打开我的应用程序,并将URL参数传递给它?


可能是重复的问题,关于如何创建自己的URL协议(例如so://...),请参考此链接:https://dev59.com/kHRC5IYBdhLWcg3wK9yV - phuclv
如果您正在使用Python,可以安装simpler并使用register_protocol_handler - Carlos Roldán
6个回答

152
  1. 打开 开始,然后在 搜索 中输入 regedit -> 应该会打开注册表编辑器

  2. 点击 右键HKEY_CLASSES_ROOT 上,然后选择 新建 ->

enter image description here

在“键”中,输入您想要将URL称为的小写名称(在我的情况下,它将是testus://sdfsdfsdf),然后点击右键testus上 -> 然后选择新建 -> 字符串值并添加URL协议,不需要值。

enter image description here

然后像你在协议中所做的那样添加更多条目(右键 新建 -> ),并创建层次结构,如 testus -> shell -> open -> command,在 command 中将 (Default) 更改为你想要启动的 .exe 文件的路径,如果你想要向你的exe传递参数,那么将exe的路径用""包裹起来,并添加"%1",看起来像这样:"c:\testing\test.exe" "%1"

enter image description here

要测试它是否有效,请打开Internet Explorer(不要用Chrome或Firefox),然后输入testus:have_you_seen_this_man,这将启动你的.exe(会给你一些提示,你要选择是 - 选择Yes),并将参数传递给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();
        }
    }
}

希望这能为您节省一些时间。

3
哇,这东西真的好用。而且不仅在IE上可以用,在Chrome上也可以! - user1974566
1
有没有在C#中这样做的方法?就像一个安装程序一样...? - TheComputerWizard
2
@MatasVaitkevicius 谢谢。是的,我找到了答案。在这里发布,可能对其他人有用。https://dev59.com/2cHqa4cB1Zd3GeqP25aH?noredirect=1#comment121226027_68577785 - user1066231
等待有人发布.reg文件。 - WiiLF
@WiiLF,那将是一个不错的答案,欢迎您使用上面的材料来编写它。如果您这样做,我保证会给您点赞。 - Matas Vaitkevicius
显示剩余10条评论

23

[已过时 - MSDN信息已被新页面替换,该页面解决了安全问题]

MSDN链接很好,但那里的安全信息并不完整。处理程序注册应包含“%1”,而不是%1。这是一项安全措施,因为某些URL来源在调用自定义协议处理程序之前不正确地解码%20。

附注:您将获得整个URL,而不仅仅是URL参数。但是,URL可能会受到某些虐待,除了已经提到的%20->空格转换之外。在URL语法设计方面保守一些会有所帮助。不要随意添加//,否则您将陷入file://的混乱中。


7
没有正式的将file: URL映射到本地路径的规定。甚至在使用两个或三个前导斜杠时,或者当路径引用Windows目录时使用正斜杠还是反斜杠,也没有达成共识。 - MSalters
晚了点,我知道。但是是否有可能仅访问URL参数,而不使用协议处理程序? - Danilo Bargen
2
那听起来像是另一个问题。请确保术语使用正确。协议处理程序是接收URL的程序。如果没有“协议处理程序”,就没有人解析URL并访问URL参数。 - MSalters
将路径或参数用引号括起来对注册表的有效性没有影响,一些安装程序可以二者选一。 - WiiLF
1
@WiiLF:没错,注册表将其视为 REG_SZ。在内部,Windows 不解析命令行,因此空格也会被保留。但是,任何解析命令行的语言运行时(例如 C 的 argv[] 解析)都会在未引用的空格上中断。 - MSalters
显示剩余2条评论

17

如果有人想要一个.reg文件来创建关联,请见下文:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\duck]
"URL Protocol"=""
[HKEY_CLASSES_ROOT\duck\shell]
[HKEY_CLASSES_ROOT\duck\shell\open]
[HKEY_CLASSES_ROOT\duck\shell\open\command] 
@="\"C:\\Users\\duck\\source\\repos\\ConsoleApp1\\ConsoleApp1\\bin\\Debug\\net6.0\\ConsoleApp1.exe\" \"%1\""
将其复制到记事本中,文件 -> 另存为 -> duck.reg,然后运行它。运行后,当您在 Chrome 中键入duck://arg-here时,ConsoleApp1.exe将以“arg-here”作为参数运行。路径需要使用双斜杠,并且双引号必须转义。在 Windows 11上测试并适用于Edge(Chrome 版本)和Chrome。

如果注册信息已经存在会发生什么?这个 reg 会覆盖它吗? - Nitin Sawant
@NitinSawant 是的,如果它已经存在,它将覆盖它。 - duck

8

有一个用于此目的的npm模块。

链接:https://www.npmjs.com/package/protocol-registry

因此,在node.js中实现这一点,您只需要运行以下代码:

首先安装它

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

它还支持所有其他操作系统。

是否有像这样的跨平台工具作为C++库可用? - Aaron Franke
你好,这个程序有一个命令行版本叫做“protocol-registry-cli”。你可以使用它,并通过C++运行它。 - Shubham Kumar

1
进一步补充现有的答案,处理协议的应用程序不一定是已编译的应用程序。它也可以是一个脚本文件。
例如,您可以创建一个Windows批处理文件 - 如下所示 - 来处理调用。假设您将该脚本保存为c:\temp\testprotocol-handler.bat
REM just echo the passed argument
echo off
echo Hello from the custom protocol handling script.
echo script name: %0
echo script arg : %1
pause

使用以下注册表配置将脚本映射到协议testprotocol
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\testprotocol]
"URL Protocol"=""
[HKEY_CLASSES_ROOT\testprotocol\shell]
[HKEY_CLASSES_ROOT\testprotocol\shell\open]
[HKEY_CLASSES_ROOT\testprotocol\shell\open\command] 
@="\"C:\\temp\\testprotocol-handler.bat\" \"%1\""

当操作系统遇到该协议时,它将执行脚本 - 打开一个命令窗口并显示脚本中echo语句的内容。

执行示例脚本


-1
@echo off

setlocal

set "protocol_name=sugamprotocol"
set "application_path=C:\Users\%USERNAME%\Downloads\ping_execute.exe"

set "key_path=HKCU\SOFTWARE\Classes\%protocol_name%"
set "command_path=%key_path%\shell\open\command"

REM Create the registry key for the custom protocol handler
reg add "%key_path%" /ve /d "URL:Custom Protocol" /f > nul
reg add "%key_path%" /v "URL Protocol" /d "" /f > nul

REM Create the command key to specify the application to run
reg add "%command_path%" /ve /d "\"%application_path%\" \"%%1\"" /f > nul

echo Custom protocol handler registered successfully!

endlocal

要创建.bat文件,请打开文本编辑器,复制上面的代码,并将文件保存为.bat扩展名(例如register_protocol.bat)。根据您的需求,确保调整protocol_name和application_path变量。
当您运行.bat文件时,它将通过修改Windows注册表来注册自定义协议处理程序。如果注册成功,您应该会看到“自定义协议处理程序注册成功!”的消息。
请注意,修改Windows注册表需要管理员权限。请确保以管理员身份运行.bat文件。

1
你在这里的许多回答,包括一些你为某种原因创建了社区维基页面的回答,似乎很可能是完全或部分由人工智能(例如ChatGPT)编写的。请注意,在这里发布由人工智能生成的内容是不允许的(//meta.stackoverflow.com/q/421831)。如果你在任何回答中使用了人工智能工具进行辅助,请鼓励你删除它。 - NotTheDr01ds
1
读者应该仔细而批判地审查这个答案,因为由人工智能生成的信息往往包含基本错误和错误信息。如果您发现质量问题和/或有理由相信这个答案是由人工智能生成的,请相应地提供反馈。审核团队需要您的帮助来识别质量问题。 - NotTheDr01ds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接