20

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

将此问题置于上下文中的一个简短示例:我想听快捷键“⌘+W”。因此,我编写了以下代码:

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

这很好用,但是即使按下了更多修饰键,也会触发快捷方式,例如“⌃+⌘+W”或“⇧+⌃+⌥+⌘+W”。有没有办法绕过这个?

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

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

4

4 回答 4

34

我认为这会做到:

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

向 SpaceDog 致敬,指出原始掩码名称已弃用NSDeviceIndependentModifierFlagsMask.

于 2011-05-21T20:44:48.467 回答
10

斯威夫特 5 版本

if event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .command {
    // Got it!
}
于 2019-05-31T06:30:25.370 回答
4

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

他更新到新语法的答案是

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

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

于 2017-09-29T05:30:41.350 回答
0

或许更好...

if event.modifierFlags.contains(.shift){
    // do it
}
于 2021-04-19T17:26:30.230 回答