设置事件点击后,我无法确定在给定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的命令,备用,选项,控制或移位。首先,我需要帮助才能理解上述原因无效。
谢谢!
答案 0 :(得分:6)
这些是位掩码,它们将按位与CGEventGetFlags
中的值进行按位或运算(或在自己创建事件时传递)。
这里不能测试相等性,因为没有单个位掩码将等于多个位掩码的组合。您需要测试单个位的相等性。
要从组合位掩码中提取单个位掩码的值,请使用按位AND(&
)运算符。然后,将其与您感兴趣的单个位掩码进行比较:
BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand;
为什么两者?
&
表达式求值为与其操作数相同的类型,在这种情况下为CGEventFlags
,这可能不适合BOOL
的大小,即signed char
1}}。 ==
表达式将其解析为1或0,这将适合BOOL
。
该问题的其他解决方案包括否定值两次(!!
)并将变量声明为bool
或_Bool
而不是Boolean
或BOOL
。当您包含stdbool.h时,C99的_Bool
类型(与bool
同义)强制其值为1或0,就像==
和!!
解决方案一样。< / p>