2010-12-12 1 views
3

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

CGEventFlags flagsP; 

flagsP=CGEventGetFlags(event); 

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

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

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

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

Спасибо!

ответ

6

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

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

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

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

Почему именно?

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

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

+0

Спасибо, Питер. Это очень хорошо объясняет и решает мою проблему. – the979kid

+0

Огромное спасибо, также знаете ли вы, есть ли способ проверить, нажат ли какой-либо модификатор? Или я должен явно проверить это для каждого из них? –

+0

Я сделал это, но не знаю, является ли это лучшим/чистым способом? 'BOOL isModifierPressed = (flags & (kCGEventFlagMaskAlternate | kCGEventFlagMaskCommand | kCGEventFlagMaskControl | kCGEventFlagMaskShift))> 0; ' –

Смежные вопросы