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



我使用NSView的自定义子类并通过keyDown/keyUp方法接收键盘事件,一切工作正常,除了按下"Cmd⌘"键时,keyDown事件正常触发,但keyUp事件从未出现。

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

有人知道为什么会这样吗?这感觉像是一个bug,但可能只是奇怪的"正确行为",有什么想法如何绕过它(除了使用替代修饰符或使用直接HID访问之类的)。

谢谢。

您可以使用flagsChanged来通知当修改键是down/up时,参见:Technical Q&A QA1519检测大写锁定键,适用于其他修改键。更多修饰符键码见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");
        }
    }
}

最新更新