检测组合按键(Control,Alt,Shift)?

时间:2016-06-01 01:18:53

标签: javascript greasemonkey tampermonkey ctrl modifier-key

我正在尝试按下 Ctrl + Alt + e 时运行脚本。
Tampermonkey如何同时触发ctrl,alt和e键?

我尝试了ctrlKeyaltKey。我发现没有任何效果。
如何编辑下面的脚本来触发 Ctrl + Alt + e ,而不仅仅是 e ?< / p>

(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();
    }
  });
})();

3 个答案:

答案 0 :(得分:40)

请参阅the W3C spec for keyboard events。提供了几个布尔属性来确定修饰键是否与您感兴趣的目标键一起被按下。它们是:

  • ctrlKey - 还按下了“控制”键。
  • shiftKey - 也按下了“Shift”键。
  • altKey - “Alt”键也被按下了。
  • metaKey - “Meta”键也被按下了。

其他重要说明

  1. The which property is deprecated
  2. 使用keydown ,因为Chrome does not fire the keypress event for known keyboard shortcuts.
  3. 某些规范属性(例如key)为only partly functional in Firefox
  4. 您不需要将代码包装在像Tampermonkey(或Greasemonkey或大多数用户脚本引擎)那样的匿名函数中。自动提供范围保护。
  5. 所以,你的代码将成为:

    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>

答案 1 :(得分:0)

按下某个键后会立即触发keypress事件。如果您按下多个键,它将在每次按下时触发事件,因此它们被视为独立按键。

相反,您可以同时使用keydownkeyup事件来检测多个按键。您可以拥有一个包含3个键和布尔状态的对象。在keydown事件上,如果当前键与对象中的键匹配,则将该键的状态设置为true。在keyup事件中,您将当前密钥的状态重置为false。如果在最后一次按键时所有3个状态均为true,则触发该事件。

请参阅使用jQuery实现此逻辑的this example

<强>更新 Brock的答案是使用修饰键与单个键码目标结合使用的更好解决方案,因为ctrlKeyaltKey修饰符是组合检测的,不是独立处理的。例如,如果您想要同时检测多个关键代码,例如EF,则需要使用keydownkeyup跟踪它们以上。

答案 2 :(得分:0)

如果像我一样,您来这里了解如何检测“ Alt Gr”键与字母键的组合,那么诸如event.altKey之类的属性将无法用于此目的,因为没有event.AltGrKey属性。

在这种情况下,您可以使用

event.getModifierState('AltGraph')

有关更多详细信息,请参见https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/getModifierState