第一次遇到这个问题是比较蒙的,后来查找资料后逐渐有了思路:
- IE 浏览器可以使用 ActiveX控件,但会有风险(我并未去验证)。
- 使用URL ,通过将URL协议添加到注册表的方法(我打算采用这种方法)。
那么,在使用第二种方法会面临以下问题,至少我是这样的:
- 如何将URL协议注册到注册表?
- 如何去查找第三方应用程序在注册表中注册的,我们能够在浏览器中调用并打开该应用程序的url协议?
- 在无法打开第三方应用程序(用户本地未安装),如何去检验这个?这个问题我没有解决掉,我在后面给出了一篇文章,可以参考下
1. 什么是注册表
注册表是微软windows 中的一个重要的数据库,用于存储系统和应用程序的设置信息。所以,我们在更改信息表信息的时候,windows 会提醒你的操作。对于,我们现在需要解决的问题来说,注册表的知识浅尝辄止即可。
2. 如何将URL协议注册到注册表
微软的官方文档解释:https://docs.microsoft/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767914(v=vs.85)
从网上的博客来看,有两种方法来实现:
-
写 reg 文件,然后点击执行(脚本)
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\myprotocol] @="myprotocol Protocol" "URL Protocol"="" [HKEY_CLASSES_ROOT\myprotocol\DefaultIcon] @="F:\\CloudMusic\\CloudMusic\\cloudmusic.exe" [HKEY_CLASSES_ROOT\myprotocol\shell] @="" [HKEY_CLASSES_ROOT\myprotocol\shell\open] @="" [HKEY_CLASSES_ROOT\myprotocol\shell\open\command] @="\"F:\\CloudMusic\\CloudMusic\\cloudmusic.exe\" "
拷贝以上内容,修改你想打开的本地应用程序的.exe文件的绝对路径,存入后缀为.reg的文件中,双击执行即可。(注意 \ 和 " 这些特殊字符)
以下是html 测试文件内容:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <div> <a href="myprotocol://"> 执行可执行文件 </a> </div> </body> </html>
我已在 google浏览器 75.0.3770.80(正式版本)和 IE 中测试通过,成功打开本地的网易云应用程序
-
通过win+r ,输入regedit 打开注册表(图形界面操作)
参考这篇博客(html启动本地.exe文件),重复的内容,请允许我偷点懒
聪明的你肯定发现第一种和第二种结果都是一样的。
3. 如何去查找第三方应用程序在注册表中注册的url协议信息
这个问题的提出是因为我们不可能操作到客户的电脑,通过上面介绍的方法将url协议注册到客户电脑上的注册表中,所以,常用的软件是不是已经提供这些注册信息了呢?这方面的文档查找,简直是无从下手;那看来只能取巧了,既然,你向注册表插入信息,那么我反向过来直接从注册表中查找吧。
通过win+r ,输入regedit 打开注册表,ctrl + F 进行查找,可以按URL Protocol
(可以勾选上项和值)、DefaultIcon
(可以勾选上项)、shell
等进行搜索,如果搜索到的内容具有和我们自己所创建的url协议一样的层级结构(最主要的是你能从值中发现应用程序的.exe绝对路径), 那么就可以使用第二步的 html 文件测试了。
搜索特定的应用程序:
拷贝应用程序的.exe文件的绝对路径,复制到查找框,勾选上数据
,注意不要勾上全字匹配
4. 在无法打开第三方应用程序(用户本地未安装),如何去检验这个
因为在我们所编写的 js 代码中就只有一个链接,即使我们能够确定我们的url是正确的,可客户端有可能没有安装,那么我们可能面临的需求是提醒客户端去安装,或者直接跳转到应用程序的下载地址。
我找到一篇关于这个问题讨论很激烈的网址,看来前辈们也是浴血奋战啊;(https://qblogs/q/74423/)
很抱歉,这个问题我也解决不了,如果真的需要的话,可以尝试下上面文章中所提到的方式。
参考博文
在网页中执行本地exe程序的两种方式