当Cmd⌘键按下时,NSResponder未收到keyUp事件

时间:2013-05-17 07:49:26

标签: macos cocoa nsview keyup nsresponder

我正在使用NSView的自定义子类并通过keyDown / keyUp方法接收键盘事件,一切正常,除非按下“Cmd⌘”键,keyDown事件正常触发但keyUp事件永远不会到来。

在我们的例子中,我们使用自己的箭头键向左/向右/向上/向下移动图像,如果用户在向左/向右按下时按住“Cmd⌘”,它将旋转图像。由于我们得到了keyDown事件,因此图像开始旋转,但它永远不会因为keyUp永远不会停止而停止。其他修饰符没有这个问题(例如,如果按住shift,ctrl或alt按下另一个键,我们会按预期获得keyUp)。一种选择是使用不同的修饰符,但最好保持它与PC版本一致(Cmd用作Windows上使用Ctrl时的替代,使其与标准复制/粘贴命令一致)。

有谁知道为什么这样做?这感觉就像一个错误,但可能只是奇怪的“正确行为”,任何想法如何解决它(除了使用替代修改器或使用直接HID访问等)。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用flagsChanged在修改键向下/向上时收到通知,请参阅:Technical Q&A QA1519 Detecting the Caps Lock Key适用于其他修饰键。有关更多修饰键代码,请参阅Carbon/Frameworks/HIToolbox/Events.h

- (void)flagsChanged:(NSEvent *)event
{
    if (event.keyCode == 0x37) { // kVK_Command
        if (event.modifierFlags & NSCommandKeyMask) {
            NSLog(@"Command key is down");            
        } else {
            NSLog(@"Command key is up");
        }
    }
}