自定义通用URL协议实现在浏览器中打开本机任意程序

以前写过一篇文章,总结了跨浏览器调用的方法。近期遇到一个场景,需要在浏览器中去打开本地的客户端程序,而且限定不允许使用IE。所以我实现了一个通用协议。通过这个协议,可以从浏览器去打开本机任意程序并支持传参数。以下是具体内容。

注册协议

将以下文件保存为.reg文件。导入注册表项,注册协议ff。你可以将所有的ff替换成别的字符串,来实现自己的协议。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\ff]
"URL Protocol"=""
@="Genaral Call"
[HKEY_CLASSES_ROOT\ff\DefaultIcon]
@=""
[HKEY_CLASSES_ROOT\ff\shell]
[HKEY_CLASSES_ROOT\ff\shell\open]
[HKEY_CLASSES_ROOT\ff\shell\open\command]
@="cmd /v:on /k set m=%1 &&call set n=%%m:ff://=%%&call set n=%%n:,= %% &&start !n! &exit"

用法

在任意浏览器中输入 ff://参数1[,参数2,参数3]

其中参数1是要打开的本地程序的完整路径;参数2,参数3是要传递给该本地程序的参数,可选。

例如:

  • 在浏览器中输入ff://C:/Windows/System32/notepad.exe 打开记事本程序

  • 在浏览器中输入ff://C:/Windows/System32/notepad.exe,c:/apk_44.conf打本记事本程序,并且会自动在记事本中打开c:/apk_44.conf这个文件

需要特别注意的是:

  • 参数如果是一个路径,那么路径分隔符需要使用/,而不是windows默认的\
  • 参数如果是一个路径,那么路径里不允许出现空格、中文。如果路径里的确存在空格、中文,可以通过快捷方式间接解决。如:想打开C:\Program Files\Microsoft VS Code\Code.exe,我们可以创建一个快捷方式指向它,然后去调用这个快捷方式,ff://c:/Code.exe.lnk
  • 参数如果不是一个路径,但有中文,那么被调用的客户端程序接收到参数将是unicode格式的,需要客户端支持识别

与前端结合

在前端开发中,只需要像使用http协议一样,使用这个自定义协议即可。如

1
<a href="ff://C:/Windows/System32/notepad.exe">打开记事本</a>

END