Webエンドコールexe実装

11079 ワード

1 URL Protocolレジストリ実装
url protocolを利用して、まずクライアントがレジストリの実現処理を行う必要があり、具体的にはテンセントの実現を参照することができる.
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\TENCENT] @=“TencentProtocol”“URL Protocol”=“D:\Program Files\Tencent\QQ\Timwp.exe” [HKEY_CLASSES_ROOT\TENCENT\DefaultIcon] @=“D:\Program Files\Tencent\QQ\Timwp.exe,1” [HKEY_CLASSES_ROOT\TENCENT\shell] [HKEY_CLASSES_ROOT\TENCENT\shell\open] [HKEY_CLASSES_ROOT\TENCENT\shell\open\command] @="“D:\Program Files\Tencent\QQ\Timwp.exe” “%1"”
この文書では、Windows Registry Editor Version 5.00をメモ帳で検証します.
[HKEY_CLASSES_ROOT\myprotocol] @=“myprotocol Protocol” “URL Protocol”=""
[HKEY_CLASSES_ROOT\myprotocol\DefaultIcon] @=“C:\WINDOWS\NOTEPAD.EXE”
[HKEY_CLASSES_ROOT\myprotocol\shell] @=""
[HKEY_CLASSES_ROOT\myprotocol\shell\open] @=""
[HKEY_CLASSES_ROOT\myprotocol\shell\open\command] @="“C:\WINDOWS\NOTEPAD.EXE” "
フロントエンドページエンドコール実装
パラメータを必要に応じて追加すれば、urlのパラメータ形式myprotocol://name=tomを参照できます.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>URL Protocol Test</title>
</head>
<body>

<h1><h1/>
<a href=myprotocol://>myprotocol</a> 

</body>
</html>

jsで呼び出しがインストールされたかどうかは失敗してコールバックに成功し、プロジェクトで使用されているchromeは、一部の実装のみを抽出し、レジストリの読み取りに成功するとポップアップしてフォーカスを取得し、成功を確認するのが原理です.ソフトウェアがインストールされていないと考えられます.
  • リファレンス実装:https://github.com/ismailhabib/custom-protocol-detection
  • 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 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 _createHiddenIframe(target, uri) {
      var iframe = document.createElement('iframe');
      iframe.src = uri;
      iframe.id = 'hiddenIframe';
      iframe.style.display = 'none';
      target.appendChild(iframe);
    
      return iframe;
    }