58

Ctrl+ Alt+eが押されたときにスクリプトを実行しようとしています。
Tampermonkey はどのようにして ctrl、alt、および e キーを同時に押すことができますか?

と を試しましctrlKeyaltKey。うまくいくものは何も見つかりませんでした。以下のスクリプトを編集して + +だけでなく+ +で
起動するにはどうすればよいですか?CtrlAltee

(function() {
  document.addEventListener("keypress", function(e) {
    if (e.which == 101) {
      var xhttp = new XMLHttpRequest;
      xhttp.onreadystatechange = function() {
        4 == xhttp.readyState && 200 == xhttp.status && eval(xhttp.responseText)
      }, xhttp.open("GET", "http://127.0.0.1:2337/inject", !0), xhttp.send();
    }
  });
})();

4

5 に答える 5

99

キーボード イベントについては、W3C 仕様を参照してください。関心のあるターゲット キーと組み合わせて修飾キーが押されたかどうかを判断するために、いくつかのブール属性が提供されます。それらは次のとおりです。

  • ctrlKey     -- 「Control」キーも押されました。
  • shiftKey   -- 「Shift」キーも押されました。
  • altKey       -- 「Alt」キーも押されました。
  • metaKey     -- 「メタ」キーも押されました。

その他の重要事項:

  1. このwhichプロパティは非推奨です
  2. keydownChrome は既知のキーボード ショートカットのイベントを発生させないため、使用します。keypress
  3. などの一部の仕様プロパティは、Firefox では部分的にしか機能しませkeyん。
  4. Tampermonkey (または Greasemonkey またはほとんどのユーザー スクリプト エンジン) のような無名関数でコードをラップする必要はありません。スコープ保護は自動的に提供されます。

したがって、コードは次のようになります。

document.addEventListener ("keydown", function (zEvent) {
    if (zEvent.ctrlKey  &&  zEvent.altKey  &&  zEvent.key === "e") {  // case sensitive
        // DO YOUR STUFF HERE
    }
} );

この便利なデモを実行します(key完全にサポートされるようになりました)

var targArea = document.getElementById ("keyPrssInp");
targArea.addEventListener ('keydown',  reportKeyEvent);

function reportKeyEvent (zEvent) {
    var keyStr = ["Control", "Shift", "Alt", "Meta"].includes(zEvent.key) ? "" : zEvent.key + " ";
    var reportStr   =
        "The " +
        ( zEvent.ctrlKey  ? "Control " : "" ) +
        ( zEvent.shiftKey ? "Shift "   : "" ) +
        ( zEvent.altKey   ? "Alt "     : "" ) +
        ( zEvent.metaKey  ? "Meta "    : "" ) +
        keyStr + "key was pressed."
    ;
    $("#statusReport").text (reportStr);

    //--- Was a Ctrl-Alt-E combo pressed?
    if (zEvent.ctrlKey  &&  zEvent.altKey  &&  zEvent.key === "e") {  // case sensitive
        this.hitCnt = ( this.hitCnt || 0 ) + 1;
        $("#statusReport").after (
            '<p>Bingo! cnt: ' + this.hitCnt + '</p>'
        );
    }
    zEvent.stopPropagation ();
    zEvent.preventDefault ()
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<p><label>Press keys in here:<input type="text" value="" id="keyPrssInp"></label>
</p>
<p id="statusReport"></p>

于 2016-06-01T05:01:16.360 に答える
6

keypressキーが押されるとすぐにイベントが発生します。複数のキーを押している場合は、押すたびにイベントが発生するため、それらは独立したキーの押下と見なされます。

keydown代わりに、とイベントの両方を使用して、keyup複数のキーの押下を検出できます。3 つのキーとブール状態を含むオブジェクトを持つことができます。イベントで、keydown現在のキーがオブジェクト内のキーと一致する場合、trueそのキーの状態を に設定します。keyupイベントで、現在のキーの状態を にリセットしますfalsetrue最後にキーを押した時点で3 つの状態がすべて存在する場合は、イベントを発生させます。

jQuery を使用してこのロジックを実現するこの例を参照してください。

UpdatectrlKey Brock's answer は、単一のキー コード ターゲットと 組み合わせて修飾キーを使用するためのより良いソリューションですaltKeyEたとえば、とのような複数のキー コードを検出したい場合は、上記のように とFを使用してそれらを追跡する必要があります。keydownkeyup

于 2016-06-01T02:18:54.357 に答える
1

私のように、「Alt Gr」キーと文字キーの組み合わせを検出する方法を見つけるためにここに来た場合、event.AltKey がないため、たとえば event.altKey のようなプロパティをこれに使用することはできません。財産。

その場合、使用できます

event.getModifierState('AltGraph')

詳細については、https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/getModifierStateを参照してください。

于 2020-09-28T07:31:11.780 に答える