web-dev-qa-db-fra.com

Wykrywanie kombinacji klawiszy (Ctrl, Alt, Maj)?

Próbuję uruchomić skrypt, gdyCtrl+Alt+ejest wciśnięty.
Jak można uruchomić programme Tampermonkey na jednoczesnym klawiszu Ctrl, Alt i E?

Próbowałem ctrlKey i altKey. Nie znalazłem nic, co działa.
Jak mogę edytować poniższy skrypt, aby strzelaćCtrl+Alt+e, zamiast po prostue?

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

Reportez-vous à spécification W3C pour les événements de clavier . Plusieurs attributs booléens sont fournis pour déterminer si touches de modification ont été utilisées conjointement avec la touche cible qui vous intéresse. Ce sont:

  • ctrlKey - La touche "Control" a également été actionnée.
  • shiftKey - La touche "Shift" a également été enfoncée.
  • altKey - La touche "Alt" a également été actionnée.
  • metaKey - La touche "Meta" a également été actionnée.

Autre notes importantes:

  1. _ { La propriété which est obsolète }.
  2. Utilisez keydown car Chrome ne déclenche pas l'événement keypress pour les raccourcis clavier connus.
  3. Certaines propriétés spécifiées, telles que key, sont partiellement fonctionnel dans Firefox .
  4. Vous n'avez pas besoin de placer votre code dans une fonction anonyme, comme celle de Tampermonkey (ou de Greasemonkey ou de la plupart des moteurs d'utilisateurs). La protection de la portée est automatiquement fournie.

Donc, votre code deviendrait:

document.addEventListener ("keydown", function (zEvent) {
    if (zEvent.ctrlKey  &&  zEvent.altKey  &&  zEvent.code === "KeyE") {
        // DO YOUR STUFF HERE
    }
} );

Exécutez cette démo pratique:

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

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

    //--- Was a Ctrl-Alt-E combo pressed?
    if (zEvent.ctrlKey  &&  zEvent.altKey  &&  zEvent.code === "KeyE") {
        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>

36
Brock Adams

L'événement keypress est déclenché dès qu'une touche est enfoncée. Si vous appuyez sur plusieurs touches, l'événement est déclenché à chaque pression; elles sont donc considérées comme des pressions indépendantes.

Au lieu de cela, vous pouvez utiliser les événements keydown et keyup pour détecter plusieurs appuis sur les touches. Vous pouvez avoir un objet contenant les 3 clés et un état booléen. Sur l'événement keydown, si la clé actuelle correspond à une clé de l'objet, vous définissez l'état sur true pour cette clé. Sur l'événement keyup, vous réinitialisez l'état de la clé actuelle sur false. Si tous les 3 états sont true au moment de la dernière pression sur une touche, déclenchez l'événement.

Voir cet exemple qui réalise cette logique en utilisant jQuery.

Update La réponse de Brock est une meilleure solution pour vous en combinant des touches de modification avec une cible de code de touche unique, car les modificateurs ctrlKey et altKey sont détectés en combinaison, et ne sont pas gérés indépendamment. Si vous souhaitez détecter plusieurs codes de clé tels que E et F ensemble, par exemple, vous devez les suivre à l'aide de keydown et keyup comme indiqué ci-dessus.

0
Gideon Pyzer