自定义外部协议使浏览器拉起本地程序

本文详细阐述了如何在Chrome移除NPAPI支持后,通过自定义浏览器协议让游戏在浏览器中与本地程序交互。介绍了原理、注册表结构以及遇到的问题和解决方案,重点在于Chrome版本对协议支持的影响和注册表设置的关键。
摘要由CSDN通过智能技术生成

什么是自定义协议

由于我们的游戏需要在浏览器中调用NPAPI插件,而chrome移除了NPAPI的支持,导致游戏并不能很好的适配所有的浏览器,所以这个时候我们对于chrome浏览器用到了自定义浏览器协议这一标准。自定义浏览器协议允许在浏览器中使用protocol://url的形式进行调用本地程序。包括在网页上拉起百度云网盘、或者拉起QQ等等等等,都属于自定义浏览器协议。

原理分析

在通过浏览器调用外部程序时,浏览器会在我们本地的注册表中查找协议所对应的注册表,并获取实际要调用的程序路径进行调用。

例:xy://callback/?id=opaqueInternalAccesssObj

xy://为我们自定义的浏览器协议,后面的callback/?id=opaqueInternalAccessObj则为实际传入的参数(如果需要的话)

注册表解析

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\xy]
@="GameLoader Plugin"
"URL Protocol"="C:\\Windows\\System32\\cmd.exe"

[HKEY_CLASSES_ROOT\xy\shell]

[HKEY_CLASSES_ROOT\xy\shell\open]

[HKEY_CLASSES_ROOT\xy\shell\open\command]
@="C:\\Windows\\System32\\cmd.exe \"%1\""

保存成xy.reg,双击运行后在浏览器中输入xy://后会提示是否打开GameLoader Plugin(实则是打开Windows Shell)。

  1. [HKEY_CLASSES_ROOT] 是应用程序运行时必须的信息,[HKEY_CLASSES_ROOT\xy]表示在该注册表目录下生成了一个xy的应用程序运行时必须的信息。@=为该应用程序默认名称,用来显示程序名称,不填则为exe名称, URL Protocol=为该协议所要调用的程序地址。

  2. [HKEY_CLASSES_ROOT\xy\shell]在xy\下生成shell目录。

  3. [HKEY_CLASSES_ROOT\xy\shell\open]在xy\shell\下生成open目录

  4. [HKEY_CLASSES_ROOT\xy\shell\open\command]在xy\shell\open\下生成command目录,@=在command目录下新建一个默认值为协议调用程序的实际路径。

自定义协议的坑

我们的游戏客户端注册表一开始没有在[HKEY_CLASSES_ROOT\xy]下写入"URL Protocol=(path...)"的注册信息,导致在chrome v74及以上浏览器中无法拉起外部程序,而在v74以下则可以拉起。遇到这个问题时,起初我怀疑是chrome在更新后移除掉这个功能,于是从v68版本看到了v74版本的移除功能说明文档后,发现该功能未更新也未移除。于是我困惑的想到去下个chrome v74版本来进行测试,打开百度云地址,点击下载,发现百度云网盘能拉起客户端,于是f12查看百度云所调用的地址baiduyunguanjia://xxxxxxx,卧槽?

遂进入regedit.exe中进行查看,默默的比对百度云与我们的注册表有何不同,查看到根目录时发现百度云多了个URL Protocol,于是在我们的注册表上加上后,chrome v74版本及以上的都可以调用外部程序了,所以不管在新版还是旧版的浏览器中,注册表中在根目录一定要加上URL Protocol的路径,以确保能正常拉起本地程序。

 

各位朋友做协议时应该见过如下url: tencent://message/?uin=88888Site=bbs.125.laMenu=yes 复制代码 在浏览器里打开这个连接,会唤起qq的聊天窗口,并且根据传递的参数88888,打开了与88888的强制聊天窗口,如下图: 又比如打开浏览器,输入 steam://install/943700 复制代码 居然会唤起steam的安装界面,安装某个游戏。 是否想知道他们是如何实现的呢? 通过注册表中的探索,发现了秘密: 导出注册表查看: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\steam] @="URL:steam protocol" "URL Protocol"="" [HKEY_CLASSES_ROOT\steam\DefaultIcon] @="Steam.exe" [HKEY_CLASSES_ROOT\steam\Shell] [HKEY_CLASSES_ROOT\steam\Shell\Open] [HKEY_CLASSES_ROOT\steam\Shell\Open\Command] @="\"C:\\Program Files (x86)\\Steam\\Steam.exe\" -- \"%1\"" 原来是在这里的定义了私有协议,我们依葫芦画瓢,来定义一个自己的私有协议“Mofei”吧。 构造一个注册表: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Mofei] @="URL:Mofei Protocol Handler" "URL Protocol"="" [HKEY_CLASSES_ROOT\Mofei\shell] [HKEY_CLASSES_ROOT\Mofei\shell\open] [HKEY_CLASSES_ROOT\Mofei\shell\open\command] @="C:\\Users\\Administrator\\Desktop\\test.exe \"%1\"" 以上代码中"Mofei"为需要注册的协议名,例如Tencent/steam。 下面的 HKEY_CLASSES_ROOT\Mofei\shell\open\command的键值“ C:\\Users\\Administrator\\Desktop\\test.exe ”为要处理的程序的路径。 可以将以上代码通过记事本保存为xx.reg,双击此注册表文件导入。也可以通过精易模块 自行操作注册表来创建表项和键值。 此一步的目的是告诉windows,假如计算机请求的url是以"mofei://"为开头,就交给注册表中用户自定义程序来处理,且整个请求的url内容作为启动参数,传递给应用程序。 例如在你的浏览器中打开 "mofei://hahaha",此时windows将会启动我们设定的test.exe程序,并且将"mofei://hahaha"作为启动参数传递给test.exe。 现在我们启动易语言 ,新建一个空白无窗口程序,写下如下代码: 窗口程序集名 保 留 保 留 备 注 程序集1 子程序名 返回值类型 公开 备 注 _启动子程序 整数型 请在本子程序中放置动态链接库初始化代码 变量名 类 型 静态 数组 备 注 aa 文本型 0 取命令行 ( aa) 信息框 ( aa[ 1] , 0, ,) 返回 ( 0) ' 返回值被忽略。 将程序编译为test.exe,放置到桌面上(我们事先定义的路径)。 现在,我们打开任意浏览器(大部分浏览器都支持私有协议),输入我们注册的"mofei://hahaha",处于安全考虑,首次使用新注册的私有协议浏览器程序会先询问是否允许,选择允许即可。 于是,你看到了如下界面,此时我们自己注册的私有协议就成功的拉起了我们的程序。 firefox和chrome都可以哦: 现在,我们可以取出参数供我们的程序使用。 窗口程序集名 保 留 保 留 备 注 程序集1 子程序名 返回值类型 公开 备 注 _启动子程序 整数型 请在本子程序中放置动态链接库初始化代码 变量名 类 型 静态 数组 备 注 aa 文本型 0 取命令行 ( aa) 信息框 ( 取文本中间 ( aa[ 1] , 9,取文本长度 ( aa[ 1] ) - 9) , 0, ,) 返回 ( 0) ' 返回值被忽略。 用firefox来看一下执行结果。 个别浏览器会对传入的中文参数进行url编码,例如chrome,如果你的程序中未判断参数编码,就会造成如下状况,如下演示: 不止是浏览器可以唤起,连windows的资源管理器也可以唤起哦。 甚至连易语言也可以唤起哦。 方
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值