如何通过自定义协议在html中调起本地程序

由于业务需要,项目中同时存在B/S架构(web应用)和C/S架构(桌面应用)。

最近一次产品迭代中,我们通过自定义协议实现了在web端增加了一个可以调起桌面应用的入口,简单又便捷。

自定义协议

浏览器允许我们通过使用 protocol://url 的形式进行调用本地程序。

假如你电脑安装了迅雷,那你应该很熟悉这种体验,甚至你可以直接在url栏键入thunder://、ed2k://、magnet://来调起本地的迅雷程序

背后的原理是,软件在安装的同时修改了本机电脑的注册表,分别注册了以上协议来调起程序。因此我们也可以利用这个机制,通过修改本地注册表来按需添加自定义协议。

关于注册表

Windows注册表是Windows操作系统的核心数据库,它存储了系统和应用程序的所有配置信息。注册表的主要功能包括存储系统和软件的设置、记录安装的应用程序和硬件列表、控制用户账户和安全选项、设置系统选项和个性化功能、保存网络设置和配置。注册表采用树形结构组织数据,由主键、子键和值组成,其中主键位于最顶层,子键位于主键下,用于进一步分类,每个子键下的具体数据包括名称、类型和内容。

自定义协议主要是在注册表中的HKEY_CLASSES_ROOT根键下增加CLSID,并将它分配给对应程序作为系统内的连接。

注册表总共有5个根键分别对应系统内不同配置内容,自定义协议可按照以下方式实现。

其余配置在本内容中不涉及,其余部分配置较为敏感,可能影响计算机运行,建议备份后修改。

添加自定义协议:方法1

方法一:通过编写注册表脚本REG文件,双击后可将数据注入到注册表中。

新建记事本写好对应添加的配置项目,然后将文件后缀名改为.reg后双击运行。

js 复制代码
Windows Registry Editor Version 5.00  
  
[HKEY_CLASSES_ROOT\CallChrome]  
 
"URL Protocol"="C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
  
@="CallChrome"  
  
[HKEY_CLASSES_ROOT\CallChrome\DefaultIcon]  
  
@="C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe,1"  
  
[HKEY_CLASSES_ROOT\CallChrome\shell]  
  
[HKEY_CLASSES_ROOT\CallChrome\shell\open]  
  
[HKEY_CLASSES_ROOT\CallChrome\shell\open\command]  
  
@="\"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe\" \"%1\""  

简单介绍下脚本内容:第 3,9,13,15,17 行是对注册表的树状节点进行修改,增加自定义协议CallChrome节点和该节点下的必要节点,第 5,7 行是对协议的描述,内容似乎对结果影响不大,第 11, 19 行是对应程序的目录地址,其中%1表示传参,可以支持CallChrome://hello方式传参。

添加自定义协议:方法2

方法二:通过修改注册表编辑器增加自定义协议,具体步骤和注册脚本内容一致。

custom-protocol-check

自定义协议是否可用是根据浏览器的宿主环境决定的,但是各家浏览器并未提供统一的方法让我们去判断。

github上有个500+stars的工具库帮我们统一了协议可用的判断方法: github: custom-protocol-detection;

同时也有基于该库维护的npm包: npm:custom-protocol-check

虽然github项目上声明已停止维护,但是经测试最新chrome、edge、firefox均可用。

相关推荐
excel1 小时前
IndexNow:让搜索引擎更快发现网站更新的主动通知协议
前端·后端·架构
子兮曰2 小时前
CSS 复现 23 种设计风格:从拟物到液态玻璃的成本阶梯与兜底写法【实战】
前端·css·视觉设计
虚无境2 小时前
如何用AI帮我写出实用的插件
前端·javascript·ai编程
柳杉3 小时前
从数字化到数智化:3D 可视化大屏的下一个五年
前端·ai编程·数据可视化
zimoyin3 小时前
在 C# 里嵌入 JavaScript:用 Jint 做可热更新的自动化脚本(从入门到踩坑)
javascript·c#·自动化
风骏时光牛马4 小时前
从零到实战:AI全栈学习进阶路线
前端
FRing034 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
用户360055579004 小时前
Kestrel_VLLM - 15 · decode 优化四连击:19ms → 8ms
前端
IT_陈寒4 小时前
JavaScript的闭包陷阱,这个坑我躺了三天才爬出来
前端·人工智能·后端
计算机魔术师4 小时前
Microsoft Research 与合作者证明 31 年历史的 KLS 猜想
前端