Web打开本地三方应用程序

Web打开本地三方应用程序

启动本地的.exe文件的方式有以下两种:

方式1: 通过使用JS打开本地exe文件。但是一般的浏览器,由于安全问题,都会禁止掉这个JS对象,这就导致部分浏览器不支持该种方式。

方式2: 利用浏览器外部协议(URL Procotol)打开本地exe文件。简单来说通过修改注册表信息,然后在项目中通过超链接或路由跳转的方式触发。话不多说上代码。

这里简单对方式2进行测试:

  • 步骤一:
    新建文件demo.reg (位置我是放到桌面)

    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT\Hbx]
    @="URL:Hbx Protocol Handler"
    "URL Protocol"=""
    [HKEY_CLASSES_ROOT\Hbx\shell]
    [HKEY_CLASSES_ROOT\Hbx\shell\open]
    [HKEY_CLASSES_ROOT\Hbx\shell\open\command]
    @="E:\\HBuilderX\\HBuilderX.exe"
    

    其中E:\\HBuilderX\\HBuilderX.exe是文件的路径,注意这里是两个\\
    修改完后,双击文件启动,修改完注册表后就可以使用了

    大概含义参考以下
    在这里插入图片描述

  • 步骤二:
    首先我们需要去下载一下protocolcheck.js

    protocolcheck.js主要功能是检测是exe程序否唤醒成功
    github下载地址:https://github.com/ismailhabib/custom-protocol-detection/blob/master/protocolcheck.js
    也可以直接复制以下代码

    	(function (f) {
    	  if (typeof exports === "object" && typeof module !== "undefined") {
    	    module.exports = f();
    	  } else if (typeof define === "function" && define.amd) {
    	    define([], f);
    	  } else {
    	    var g;
    	    if (typeof window !== "undefined") {
    	      g = window;
    	    } else if (typeof global !== "undefined") {
    	      g = global;
    	    } else if (typeof self !== "undefined") {
    	      g = self;
    	    } else {
    	      g = this;
    	    }
    	    g.protocolCheck = f();
    	  }
    	})(function () {
    	  var define, module, exports;
    	  return (function e(t, n, r) {
    	    function s(o, u) {
    	      if (!n[o]) {
    	        if (!t[o]) {
    	          var a = typeof require == "function" && require;
    	          if (!u && a) return a(o, !0);
    	          if (i) return i(o, !0);
    	          var f = new Error("Cannot find module '" + o + "'");
    	          throw ((f.code = "MODULE_NOT_FOUND"), f);
    	        }
    	        var l = (n[o] = { exports: {} });
    	        t[o][0].call(
    	          l.exports,
    	          function (e) {
    	            var n = t[o][1][e];
    	            return s(n ? n : e);
    	          },
    	          l,
    	          l.exports,
    	          e,
    	          t,
    	          n,
    	          r
    	        );
    	      }
    	      return n[o].exports;
    	    }
    	    var i = typeof require == "function" && require;
    	    for (var o = 0; o < r.length; o++) s(r[o]);
    	    return s;
    	  })(
    	    {
    	      1: [
    	        function (require, module, exports) {
    	          function _registerEvent(target, eventType, cb) {
    	            if (target.addEventListener) {
    	              target.addEventListener(eventType, cb);
    	              return {
    	                remove: function () {
    	                  target.removeEventListener(eventType, cb);
    	                },
    	              };
    	            } else {
    	              target.attachEvent(eventType, cb);
    	              return {
    	                remove: function () {
    	                  target.detachEvent(eventType, cb);
    	                },
    	              };
    	            }
    	          }
    	 
    	          function _createHiddenIframe(target, uri) {
    	            var iframe = document.createElement("iframe");
    	            iframe.src = uri;
    	            iframe.id = "hiddenIframe";
    	            iframe.style.display = "none";
    	            target.appendChild(iframe);
    	 
    	            return iframe;
    	          }
    	 
    	          function openUriWithHiddenFrame(uri, failCb, successCb) {
    	            var timeout = setTimeout(function () {
    	              failCb();
    	              handler.remove();
    	            }, 1000);
    	 
    	            var iframe = document.querySelector("#hiddenIframe");
    	            if (!iframe) {
    	              iframe = _createHiddenIframe(document.body, "about:blank");
    	            }
    	 
    	            var handler = _registerEvent(window, "blur", onBlur);
    	 
    	            function onBlur() {
    	              clearTimeout(timeout);
    	              handler.remove();
    	              successCb();
    	            }
    	 
    	            iframe.contentWindow.location.href = uri;
    	          }
    	 
    	          function openUriWithTimeoutHack(uri, failCb, successCb) {
    	            var timeout = setTimeout(function () {
    	              failCb();
    	              handler.remove();
    	            }, 1000);
    	 
    	            //handle page running in an iframe (blur must be registered with top level window)
    	            var target = window;
    	            while (target != target.parent) {
    	              target = target.parent;
    	            }
    	 
    	            var handler = _registerEvent(target, "blur", onBlur);
    	 
    	            function onBlur() {
    	              clearTimeout(timeout);
    	              handler.remove();
    	              successCb();
    	            }
    	 
    	            window.location = uri;
    	          }
    	 
    	          function openUriUsingFirefox(uri, failCb, successCb) {
    	            var iframe = document.querySelector("#hiddenIframe");
    	 
    	            if (!iframe) {
    	              iframe = _createHiddenIframe(document.body, "about:blank");
    	            }
    	 
    	            try {
    	              iframe.contentWindow.location.href = uri;
    	              successCb();
    	            } catch (e) {
    	              if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL") {
    	                failCb();
    	              }
    	            }
    	          }
    	 
    	          function openUriUsingIEInOlderWindows(uri, failCb, successCb) {
    	            if (getInternetExplorerVersion() === 10) {
    	              openUriUsingIE10InWindows7(uri, failCb, successCb);
    	            } else if (
    	              getInternetExplorerVersion() === 9 ||
    	              getInternetExplorerVersion() === 11
    	            ) {
    	              openUriWithHiddenFrame(uri, failCb, successCb);
    	            } else {
    	              openUriInNewWindowHack(uri, failCb, successCb);
    	            }
    	          }
    	 
    	          function openUriUsingIE10InWindows7(uri, failCb, successCb) {
    	            var timeout = setTimeout(failCb, 1000);
    	            window.addEventListener("blur", function () {
    	              clearTimeout(timeout);
    	              successCb();
    	            });
    	 
    	            var iframe = document.querySelector("#hiddenIframe");