如果某个修改器被按下但没有其他修改器,请检查NSEvent的modifierFlags

Flo*_*ilz 14 cocoa objective-c event-listener nsevent modifier-key

我刚刚尝试了addLocalMonitorForEventsMatchingMask:handler:NSEvent中的方法,并遇到了以下问题:如何确定是否按了某些修饰符?

将此问题设置为上下文的简短示例:我想要听取快捷方式"⌘+ W".因此我写了以下代码:

[NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *theEvent) {
    if ([theEvent modifierFlags] & NSCommandKeyMask && [theEvent keyCode] == 13) {
        [self.window performClose:self];
    }
    return theEvent;
}];
Run Code Online (Sandbox Code Playgroud)

这很有效,但即使按下更多修饰键,也会触发快捷键,例如"^ +⌘+ W"或"⇧+ ^ +⌥+⌘+ W".有没有办法规避这个?

一个简单的解决方案是检查所有其他修改键并确保没有按下它们.这似乎很乏味且容易出错 - 除了它的丑陋之外,因为它现在与一元"&".此外,如果(由于某种原因)另一个修改键添加到键盘布局,您可能会遇到麻烦.

一如既往,我很感谢任何建议.

Jos*_*ell 30

我想这会做到这一点:

// Mask out everything but the key flags
NSUInteger flags = [theEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
if( flags == NSCommandKeyMask ){
    // Got it!
}
Run Code Online (Sandbox Code Playgroud)

向SpaceDog提示,指出原始掩码名称的弃用,NSDeviceIndependentModifierFlagsMask.

  • 哇,这很整洁!现在我只需要使用一元"&"一次,最后了解`NSDeviceIndependentModifierFlagsMask`的用途:modifierFlags默认设置为256,并且添加了其他标志,这样我只清理按键由`modifierFlags`值表示.这样就可以在Carbon中编写修饰键的组合,例如`flags == NSCommandKeyMask + NSControlKeyMas`,如果应该按⌘**和**^而不是写`flags&NSCommandKeyMask && flags&NSControlKeyMask`.非常感谢! (4认同)

vau*_*all 10

斯威夫特 5 版本

if event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .command {
    // Got it!
}
Run Code Online (Sandbox Code Playgroud)


Spa*_*Dog 6

感谢 Apple,@JoshCaswell 的答案已经过时,因为NSDeviceIndependentModifierFlagsMask自 10.12 以来已被弃用。

他的答案更新为新语法:

// Mask out everything but the key flags
NSUInteger flags = [theEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
if( flags == NSCommandKeyMask ){
  // Got it!
}
Run Code Online (Sandbox Code Playgroud)

NSDeviceIndependentModifierFlagsMask已被替换为,NSEventModifierFlagDeviceIndependentFlagsMask因为它使世界变得不同......