如何在 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(不是ChromeFirefox)并输入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 协议?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 的 URL 方案(协议处理程序)编程?

如何创建“自定义协议”并将其映射到应用程序?

当 url 有标签和问号时,注册自定义 URI 方案在 Windows 7 上不起作用

如何在 C# 中调用自定义 url 协议?

如何检测浏览器的协议处理程序?

如何确保使用了我的自定义 URL 协议?