Проверьте modifierFlags NSEvent, если был выбран определенный модификатор, но нет другого - PullRequest
14 голосов
/ 22 мая 2011

Я только что экспериментировал с методом addLocalMonitorForEventsMatchingMask:handler: в NSEvent и натолкнулся на следующий вопрос: Как мне узнать, были ли нажаты only *1004* определенные модификаторы?

Короткий пример, чтобы задать этот вопрос в контексте: я хотел послушать ярлык "& # x2318; + W". Поэтому я написал следующий код:

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

Это работает хорошо, однако ярлык будет срабатывать, даже если нажаты другие клавиши-модификаторы, например, "& # x2303; + & # x2318; + W" или "& # x21E7; + & # x2303; + & # x2325; + & # x2318; + W". Есть ли способ обойти это?

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

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

Ответы [ 3 ]

29 голосов
/ 22 мая 2011

Я думаю, что это будет сделано:

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

Шляпа подсказка к SpaceDog для указания на устаревшее имя маски , NSDeviceIndependentModifierFlagsMask.

3 голосов
/ 29 сентября 2017

@ JoshCaswell ответ был устаревшим благодаря Apple, потому что NSDeviceIndependentModifierFlagsMask устарел с 10.12.

Его ответ обновлен до нового синтаксиса:

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

NSDeviceIndependentModifierFlagsMask имеетбыл заменен на NSEventModifierFlagDeviceIndependentFlagsMask, потому что это имеет огромное значение ...

1 голос
/ 31 мая 2019

Версия Swift 5

if event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .command {
    // Got it!
}
...