首页 知识「Expertise」正文

前端JS调用exe程序

在做web应用的时候,经常会遇到在web中调用本地应用程序的问题,例如在web中点击一个按钮,然后打开自己写的或者别人的应用程序,经常在淘宝天猫购物的会发现当想跟客服沟通,点击阿里旺旺图标的时候会调用起客户端。QQ聊天也有这样效果的实现。


在IE中提供了ActiveXObject方法,于是在IE浏览器下可以这样写:

<script type="text/javascript">
        function getJkMonitor(serviceInfo) {
            var Shell = new ActiveXObject("WScript.Shell");
            try {
                //exe程序所在位置以及要传的参数
                var kk = "C:\\KdMonitor\\KdMonitor.exe 888888";
                var aa = Shell.Run(kk, 1, false);
            }
            catch (e) {
                alert("该可执行文件不存在");
            }
        }
        //调用函数
        getJkMonitor();
</script>

完整带参数

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebMianReport.aspx.cs" Inherits="WebReports.WebMianReport" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
    .showandhidden
    {
        display:none;
        }
          .buju
    {
        text-align:center;
        }
    </style>
    <script type="text/javascript" language="javascript">
        function GetRequest() {
            var url = location.search; //获取url中"?"符后的字串  
            var theRequest = new Object();
            if (url.indexOf("?") != -1) {
                var str = url.substr(1);
                strs = str.split("&");
                for (var i = 0; i < strs.length; i++) {
                    theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
                }
            }
            return theRequest;
        }
</script> 
    <script type="text/javascript" language="javascript">
        function Run(path) {
            var objShell = new ActiveXObject("wscript.shell");
            //objShell.exec(path);
            objShell.run(path, 1, false);
            objShell = null;
        }

        function LaunchApp(exepath) {
            if (!document.all) {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                var file = window.Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
                file.initWithPath(exepath);
                var run = window.Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
                run.init(file);
                var parameters = [""];
                run.run(false, parameters, parameters.length);
            }
            else {
                var ws = new ActiveXObject("WScript.Shell");
                ws.Exec(exepath);
            }
        }
</script> 
<script type="text/javascript" language="javascript">

    window.onload = function () {
        var url_list = GetRequest();
        //Run(url_list["p"] + " " + url_list["l"] + " " + url_list["s"] + " " + url_list["p"]);
        Run(url_list["p"] + " " + url_list["l"] + " " + url_list["s"]);
        window.opener = null;
        window.open('', '_self'); 
        window.close();
    }
</script>
</head>
<body  >
    <form id="form1" runat="server">
    <div style="height: 344px; width: 625px">
    即将跳转到表单打印页面,请稍候。。。。。。
    </div>
    </form>
</body>

</html>


在让整个网页运行在IE下给人不是很好的体验,于是实现在其他浏览器下该多好。

其他浏览器的实现需要自定义注册表,注册表内容如下:

Windows Registry Editor Version 5.00  
  
[HKEY_CLASSES_ROOT\NetPosaVideo]  
  
"URL Protocol"="C:\\KdMonitor\\KdMonitor.exe"  
  
@="NetPosaVideoProtocol"  
  
[HKEY_CLASSES_ROOT\NetPosaVideo\DefaultIcon]  
  
@="C:\\KdMonitor\\KdMonitor.exe,1"  
  
[HKEY_CLASSES_ROOT\NetPosaVideo\shell]  
  
[HKEY_CLASSES_ROOT\NetPosaVideo\shell\open]  
  
[HKEY_CLASSES_ROOT\NetPosaVideo\shell\open\command]  
  
@="\"C:\\KdMonitor\\KdMonitor.exe\" \"%1\""

第一行是注册表工具的版本信息;


第二行中的NetPosaVideo就是在HKEY_CLASSES_ROOT下面添加一个NetPosaVideo树,其中NetPosaVideo的名称就对应着自定义URL Protocol的名称,在web中调用的时候需要这个名称;


第三行中的是指定应用程序的路径,注意:只能是exe的程序,每级目录之间用双反斜杠;


第四行是协议的名称;


第五行表示在Simu中再加一个分支,照抄;


第六行也是对应的程序路径,后面的1照抄;


第七、第八、第九行同第五行;


第十行也是将路径换成自己的程序路径,其中%1表示到参数。


将#之间的内容复制到一个txt文档中,修改后缀名为.reg,双击该文件即可直接导入到注册表中。


Html调用:

<a href="NetPosaVideo://888888">打开视频监控</a>


本文标题:前端JS调用exe程序
本文链接:https://vtzw.com/post/213.html
作者授权:除特别说明外,本文由 零一 原创编译并授权 零一de世界 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。

评论