我刚尝试使用NSEvent中的addLocalMonitorForEventsMatchingMask:handler:
方法,并遇到以下问题:如何找出是否仅按下了某些修饰键?
以下是一个简短的示例,以将此问题设置为上下文:我想监听快捷键“⌘+W”。因此我编写了以下代码:
[NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *theEvent) {
if ([theEvent modifierFlags] & NSCommandKeyMask && [theEvent keyCode] == 13) {
[self.window performClose:self];
}
return theEvent;
}];
这个方法很有效,但快捷键会在按下更多修改键时触发,比如 "⌃+⌘+W" 或 "⇧+⌃+⌥+⌘+W"。有没有什么方法可以规避这个问题?
一个简单的解决方案是检查所有其他修改键并确保它们未被按下。这似乎很繁琐且容易出错 - 再加上现在已经够丑陋了,只用一元运算符"&"。此外,如果(由于某种原因)键盘布局添加了另一个修饰键,则可能会遇到麻烦。
像往常一样,我感谢任何建议。
NSDeviceIndependentModifierFlagsMask
的用途了:modifierFlags通常默认设置为256,然后添加其他标志位,这样就可以清除未按下的键,只留下已按下的键所对应的modifierFlags
值。这样可以像Carbon一样编写组合的修改键,例如flags == NSCommandKeyMask + NSControlKeyMas
,表示需要同时按下 ⌘ 和 ⌃而不是写成flags & NSCommandKeyMask && flags & NSControlKeyMask
。非常感谢! - Florian Pilz[theEvent modifierFlags] & (NSControlKeyMask|NSCommandKeyMask)
可用于多个。 - Yunus Nedim Mehel