下面的代码在您按单个键时有效。
@Override public void handleEvent(Event evt) {
switch(evt.type) {
case SWT.KeyDown:
System.out.println(evt.keyCode + " pressed");
break;
case SWT.KeyUp:
System.out.println(evt.keyCode + " released");
break;
}
}
...
widget.addListener(SWT.KeyDown, this);
widget.addListener(SWT.KeyUp, this);
但是当您先按“ A”然后按“ B”之类的多个键时,侦听器将仅收到“ B”的按下事件,而没有“ A”的事件。因此,...
switch(evt.type) {
case SWT.KeyDown:
mKeyMap.get(evt.keyCode).isDown = true;
break;
case SWT.KeyUp:
mKeyMap.get(evt.keyCode).isDown = false;
break;
}
键“ A”将始终保持为真,直到您再次按下它并接收到按下事件和按下事件。但是,使用箭头键不会发生此问题。您可以按多个箭头键,它会正确发送向上键事件。
所以,为什么在按下键“ A”和“ B”时没有为键“ A”发送键释放事件?
这可能在一定程度上受到键盘的影响。我不确定这是否是造成您问题的原因,但请查看此链接:
http://www.tomshardware.com/forum/50383-28-pressing-multiple-keys-keyboard-problem
环顾四周(因为我在游戏代码方面也遇到了同样的问题),我发现了这个Eclipse错误:
Bug 50020 - KeyReleased not working correctly.
似乎该问题已经存在大约8年了,不可能在短期内解决/解决。 :(
function isUserPressingCopy(){
var copy = ["Meta", "c"]
var map = {};
let buttonPressed = []
onkeydown = onkeyup = function(event){
event;
map[event.key] = event.type == 'keydown';
buttonPressed.push(map[event.key])
if (Object.values(map).every(item => item === true)){
if(JSON.stringify(Object.keys(map)) == JSON.stringify(copy))
console.log("you pressed copy")
}
else{
map = {}
}
}
}
当您在控制台中声明此功能并执行该功能时,您应该能够在Mac上执行“ cmd” +“ c”,并且控制台会告诉您是否按下了copy(通过将其与我设置的copy变量进行比较) 。
这是我检查两个键是否被按下的方法,我必须创建一个对象来存储被按下的键,为所需的键创建一个对象,并将它们以数组形式进行字符串化以进行比较,个人而言,这是我搜索的首选方法多个按键事件。
((通过使用热键作为示例来简化此操作,但希望对您有所帮助!)