为什么按下两个键时不发送键释放事件?

问题描述 投票:2回答:3

下面的代码在您按单个键时有效。

@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”发送键释放事件?

swt
3个回答
0
投票

这可能在一定程度上受到键盘的影响。我不确定这是否是造成您问题的原因,但请查看此链接:

http://www.tomshardware.com/forum/50383-28-pressing-multiple-keys-keyboard-problem


1
投票

环顾四周(因为我在游戏代码方面也遇到了同样的问题),我发现了这个Eclipse错误:

Bug 50020 - KeyReleased not working correctly.

似乎该问题已经存在大约8年了,不可能在短期内解决/解决。 :(


-1
投票
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变量进行比较) 。

这是我检查两个键是否被按下的方法,我必须创建一个对象来存储被按下的键,为所需的键创建一个对象,并将它们以数组形式进行字符串化以进行比较,个人而言,这是我搜索的首选方法多个按键事件。

((通过使用热键作为示例来简化此操作,但希望对您有所帮助!)

© www.soinside.com 2019 - 2024. All rights reserved.