检测组合键(Control、Alt、Shift)



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

我试过ctrlKeyaltKey。我没有发现任何有效的方法
我如何编辑下面的脚本以在Ctrl+Alt+

e

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

有关键盘事件,请参阅W3C规范。提供了几个布尔属性来确定修改键是否与您感兴趣的任何目标键一起按下。它们是:

  • ctrlKey nbsp;--还按下了"Control"(控制)键
  • shiftKey还按下了"Shift"键
  • altKey nbsp;--还按下了"Alt"键
  • metaKey --"Meta"键也被按下

其他重要注释

  1. 不赞成使用which属性
  2. 使用keydown,因为Chrome不会为已知的键盘快捷键触发keypress事件
  3. 一些特定的属性,如key,在Firefox中只能部分发挥作用
  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>

一旦按下某个键,就会触发keypress事件。如果您按下多个按键,则每次按下都会触发事件,因此它们被视为独立的按键。

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

请参阅使用jQuery实现此逻辑的示例。

UpdateBrock的答案是将修饰符键与单个键代码目标结合使用的更好解决方案,因为ctrlKeyaltKey修饰符是组合检测的,而不是独立处理的。例如,如果您想同时检测多个密钥代码,如EF,则需要使用keydownkeyup跟踪它们,如上所述。

如果你和我一样,来这里了解如何检测;Alt Gr";键,则event.altKey等属性不能用于此操作,因为没有事件。AltGrKey属性。

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

event.getModifierState('AltGraph')

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

我使用热键js来抽象功能,但仍然必须让用户选择自己的自定义快捷方式(事先不知道)。然后,我尝试了@Brock Adams的答案,以获得输入框中按下快捷键的热键js的等效格式。

我在实验中发现的东西(在Chrome 92上的意大利QWERTY键盘布局上):

  • 每个AltGr字符";损失";修改器属性。AltGr可以用Ctrl+Alt组合替换。因此Ctrl+Alt+E(如OP问题)给出了Ctr+Alt+5也是如此。其他组合也有同样的问题,比如意大利键盘上的Ctrl+Alt+ò会发出@
  • 每个Shifted字符都在e.key中作为其移位的对应字符,保留修饰符属性,因此Shift+5打印为Shift+%,这是有问题的(考虑到AltGr行为)
  • 有些组合无论如何都不会触发事件。我在键盘上找到了Ctrl+Shift+9Ctrl+Shift+0Ctrl+Shift+LCtrl+Shift+Alt+D作为示例。这可能是薄膜键盘的局限性

第二点对我来说很关键,因为我们的客户习惯于Ctrl+Shift+[Number]组合。

我通过处理keyCode在48和58之间的特殊情况并手动转换为相应的数字来解决这个问题。不过,它仍然不能解决任何其他用Shift修改的特殊字符,但考虑到它们非常依赖于键盘布局,我看不到任何通用的解决方案。尽管如此,我从未见过有人想要一个带有特殊字符的快捷方式。

const input = document.getElementById("keyPrssInp");
input.addEventListener('keydown', e => {
input.value = `${e.ctrlKey ? 'ctrl+' : ''}${e.shiftKey ? 'shift+' : ''}${e.altKey ? 'alt+' : ''}${e.metaKey ? 'meta+' : ''}${["Control", "Shift", "Alt", "Meta"].includes(e.key) ? "" : (e.keyCode < 58 && e.keyCode > 47 ? e.keyCode - 48 : e.key)}`
e.preventDefault();
});
Press keys in here: <input type="text" value="" id="keyPrssInp">

如果可读性不是一个要求,并且/或者您提前知道要检查的键组合,那么使用event.keyCode而不是event.key可能更安全。

快速注释。若你们正在检测移位,那个么你们需要将你们正在检查的任何字母大写。Shift将通常的小写字母大写。

if (zEvent.shiftKey && zEvent.key === "T")

if (zEvent.ctrlKey && zEvent.key === "t")

if (zEvent.altKey && zEvent.key === "t")

相关内容

  • 没有找到相关文章

最新更新