Проверьте модификатор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?

Простым решением было бы проверить все другие ключи-модификаторы и гарантировать, что они не будут нажаты. Это кажется утомительным и склонным к ошибкам - к тому же он уродливым, как сейчас, с унарным "&". Кроме того, вы можете столкнуться с проблемами, если (по какой-то причине) к макетам клавиатуры добавлен еще один ключ-модификатор.

Как всегда, я благодарен за любые рекомендации.

Ответы

Ответ 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, потому что он создает мир различий...