Это битовые маски, которые будут поразрядно-ИЛИ объединяться в значение, которое вы получаете от CGEventGetFlags
(или передаете при создании события самостоятельно).
Вы не можете проверить равенство здесь, потому что нет ни одногобитовая маска будет равна комбинации нескольких битовых масок.Вам необходимо проверить равенство одного бита.
Чтобы извлечь значение маски одного бита из комбинированной битовой маски, используйте оператор побитового И (&
).Затем сравните это с интересующей вас однобитовой маской:
BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand;
Почему оба?
Выражение &
имеет тот же тип, что и его операнды, то есть CGEventFlags
в данном случае, который может не соответствовать размеру BOOL
, то есть signed char
.Выражение ==
разрешает это значение до 1 или 0, и это все, что уместится в BOOL
.
Другие решения этой проблемы включают отрицание значения дважды (!!
) и объявление переменной какbool
или _Bool
вместо Boolean
или BOOL
.Тип _Bool
в C99 (синоним синонима bool
при включении stdbool.h) заставляет его значение равным 1 или 0, как это делают решения ==
и !!
.