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.jsprotocolcheck.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");