Проверьте модификаторFlags NSEvent, если был нажат определенный модификатор, но нет другого
Я просто экспериментировал с методом addLocalMonitorForEventsMatchingMask:handler:
в NSEvent и наткнулся на следующий вопрос: как узнать, были ли нажаты только определенные модификаторы?
A short example to set this question into context: я wanted to listen for the shortcut "⌘+W". Therefore я wrote the following code:
[NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *theEvent) {
if ([theEvent modifierFlags] & NSCommandKeyMask && [theEvent keyCode] == 13) {
[self.window performClose:self];
}
return theEvent;
}];
This works well, however the shortcut will be triggered, even if more modifier keys are pressed, e.g. "⌃+⌘+W" or "⇧+⌃+⌥+⌘+W". Is there a way to circumvent this?
Простым решением было бы проверить все другие ключи-модификаторы и гарантировать, что они не будут нажаты. Это кажется утомительным и склонным к ошибкам - к тому же он уродливым, как сейчас, с унарным "&". Кроме того, вы можете столкнуться с проблемами, если (по какой-то причине) к макетам клавиатуры добавлен еще один ключ-модификатор.
Как всегда, я благодарен за любые рекомендации.
Ответы
Ответ 1
Я думаю, что это сделает:
// Mask out everything but the key flags
NSUInteger flags = [theEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
if( flags == NSCommandKeyMask ){
// Got it!
}
Совет шлям в SpaceDog для указания устаревшего имени оригинальной маски, NSDeviceIndependentModifierFlagsMask
.
Ответ 2
@Ответ JoshCaswell был устаревшим благодаря Apple, потому что NSDeviceIndependentModifierFlagsMask
устарел с 10.12.
Его ответ обновлен до нового синтаксиса
// Mask out everything but the key flags
NSUInteger flags = [theEvent modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
if( flags == NSCommandKeyMask ){
// Got it!
}
NSDeviceIndependentModifierFlagsMask
был заменен на NSEventModifierFlagDeviceIndependentFlagsMask
, потому что он создает мир различий...