文章目录[x]
- 0.1:一、注册自定义URL协议
- 0.2:二、在HTML中调用协议
- 0.3: 三、其他
2019年参与的项目中有一个需求,要从浏览器中点击页面中的按钮启动我编写的WPF程序。功能类似我们从网页版百度网盘下载文件,浏览器会自动启动百度网盘客户端进行下载。通过查找资料找到一种在Windows系统中可以实现的方法,使用HTML调用我们自定义的URL协议,其中自定义URL协议是通过注册表注册的。
一、注册自定义URL协议
1. 新建一个文本文件,然后把文件后缀修改成为.reg。
2. 选择这个文件后右键→编辑,使用记事本或其他文本编辑器打开这个文件。
3. 写入我们要执行的注册表内容。其中所有的WebShell都可以替换成自定义英文,要调用的exe绝对路径,示例中最下面一行的\"%1\"是为了传入程序的启动参数(如果没有启动参数,在html中不添加即可)。
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\WebShell] @="URL:WebShell Protocol" "URL Protocol"="" [HKEY_CLASSES_ROOT\WebShell\DefaultIcon] @="D:\\xxx.exe,1" [HKEY_CLASSES_ROOT\WebShell\shell] [HKEY_CLASSES_ROOT\WebShell\shell\open] [HKEY_CLASSES_ROOT\WebShell\shell\open\command] @="\"D:\\xxx.exe\" \"%1\""
4. 编写完成后保存、关闭。然后双击该文件进行执行操作,如果你不嫌麻烦也可以通过系统的注册表编辑器手动创建注册表。
二、在HTML中调用协议
在页面中通过a标签调用我们的自定义协议,其中协议名称要与注册表中的协议名称一致。如果需要传递参数,则在‘//’后面添加。
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> </head> <body> <!-- 协议名称要与我们上一步自定义的协议一致,arg为我们要传递的启动参数,没有可以不写 --> <!-- js调用方式 window.open("WebShell://",arg) --> <a href="WebShell://arg"> 点击启动EXE </a> </body> </html>
三、其他
1. 我们程序接收到的参数前带有协议名称,所以在收到参数时去掉就行了。如果有多个参数,可以在参数之间加入特殊符号再合并成一个参数,最后在解析时通过特殊符号分割即可。
2. 从浏览器启动会把exe的environment路径设为该浏览器的安装目录。这样会导致一些按相对路径加载的文件无法加载,这个时候需要在exe启动时候再重新指定一下。
System.Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
3. 如果有多个exe需要启动,可以写一个批处理文件bat,再在bat中通过参数启动不同的程序,避免创建太多的注册表。