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

Jez*_*oke 12 macos cocoa nsview nsresponder keyup

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

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

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

谢谢.

Gui*_*mbo 1

您可以使用flagsChanged在按下/按下修饰键时收到通知,请参阅:技术问答 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • OP 询问与命令键一起按下的键的 keyUp 事件。此 keyUp 事件永远不会到达。 (7认同)