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;
}];
这很有效,但即使按下更多修饰键,也会触发快捷键,例如"^ +⌘+ W"或"⇧+ ^ +⌥+⌘+ W".有没有办法规避这个?
一个简单的解决方案是检查所有其他修改键并确保没有按下它们.这似乎很乏味且容易出错 - 除了它的丑陋之外,因为它现在与一元"&".此外,如果(由于某种原因)另一个修改键添加到键盘布局,您可能会遇到麻烦.
一如既往,我很感谢任何建议.
Jos*_*ell 30
我想这会做到这一点:
// Mask out everything but the key flags
NSUInteger flags = [theEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
if( flags == NSCommandKeyMask ){
    // Got it!
}
向SpaceDog提示,指出原始掩码名称的弃用,NSDeviceIndependentModifierFlagsMask.
vau*_*all 10
斯威夫特 5 版本
if event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .command {
    // Got it!
}
感谢 Apple,@JoshCaswell 的答案已经过时,因为NSDeviceIndependentModifierFlagsMask自 10.12 以来已被弃用。
他的答案更新为新语法:
// Mask out everything but the key flags
NSUInteger flags = [theEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
if( flags == NSCommandKeyMask ){
  // Got it!
}
NSDeviceIndependentModifierFlagsMask已被替换为,NSEventModifierFlagDeviceIndependentFlagsMask因为它使世界变得不同......
| 归档时间: | 
 | 
| 查看次数: | 8002 次 | 
| 最近记录: |