Получение клавиши-модификатора нажатой в CGEvent tap - PullRequest
3 голосов
/ 12 декабря 2010

После настройки события я не могу определить, какая клавиша-модификатор была нажата с помощью CGEvent.

 CGEventFlags flagsP;

 flagsP=CGEventGetFlags(event);

 NSLog(@"flags: 0x%llX",flagsP);
 NSLog(@"stored: 0x%llX",kCGEventFlagMaskCommand);

 if (flagsP==kCGEventFlagMaskCommand) {
       NSLog(@"command pressed");
    }

Учитывая приведенный фрагмент, первый NSLog возвращает значение, отличное от второго NSLog. Не удивительно, что условие никогда не срабатывает при нажатии клавиши-модификатора команды.

Мне нужно определить, нажата ли команда, альтернатива, опция, управление или смещение для данного CGEvent. Во-первых, мне нужна помощь, чтобы понять, почему вышесказанное не работает.

Спасибо!

1 Ответ

6 голосов
/ 13 декабря 2010

Это битовые маски, которые будут поразрядно-ИЛИ объединяться в значение, которое вы получаете от CGEventGetFlags (или передаете при создании события самостоятельно).

Вы не можете проверить равенство здесь, потому что нет ни одногобитовая маска будет равна комбинации нескольких битовых масок.Вам необходимо проверить равенство одного бита.

Чтобы извлечь значение маски одного бита из комбинированной битовой маски, используйте оператор побитового И (&).Затем сравните это с интересующей вас однобитовой маской:

BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand;

Почему оба?

Выражение & имеет тот же тип, что и его операнды, то есть CGEventFlags в данном случае, который может не соответствовать размеру BOOL, то есть signed char.Выражение == разрешает это значение до 1 или 0, и это все, что уместится в BOOL.

Другие решения этой проблемы включают отрицание значения дважды (!!) и объявление переменной какbool или _Bool вместо Boolean или BOOL.Тип _Bool в C99 (синоним синонима bool при включении stdbool.h) заставляет его значение равным 1 или 0, как это делают решения == и !!.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...