从浏览器启动程序

文章目录[x]
  1. 0.1:一、注册自定义URL协议
  2. 0.2:二、在HTML中调用协议
  3. 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中通过参数启动不同的程序,避免创建太多的注册表。
点赞

发表回复

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像