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

标签 macos cocoa nsview keyup nsresponder

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

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

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

谢谢。

最佳答案

您可以使用 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");
        }
    }
}

关于macos - 按住 Cmd ⌘ 键时,NSResponder 未接收到 keyUp 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16604056/

相关文章:

python - 如何使用 Python 在 Mac OS 中打开应用程序

objective-c - 使用 Quartz 将 PDF 文档保存到磁盘

objective-c - 仅适用于文件夹的 Cocoa 查找器菜单项

objective-c - 具有可拖动的 NSTabViewItem

python - 运行 spotify python 脚本时出错

cocoa - 当进程或应用程序被终止/强制终止时收到通知吗?

objective-c - Mac应用程序的MVC架构问题

objective-c - NSRulerView,将垂直尺寸延伸到底部

swift - 使用 NSAnimationContext 淡出 NSButton

macos - 什么相当于 NSTextView 上的 contentInset 属性?