获取在CGEvent点击中按下的修改键

时间:2010-12-12 09:22:20

标签: events macos core-graphics

设置事件点击后,我无法确定在给定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 个答案:

答案 0 :(得分:6)

这些是位掩码,它们将按位与CGEventGetFlags中的值进行按位或运算(或在自己创建事件时传递)。

这里不能测试相等性,因为没有单个位掩码将等于多个位掩码的组合。您需要测试单个位的相等性。

要从组合位掩码中提取单个位掩码的值,请使用按位AND(&)运算符。然后,将其与您感兴趣的单个位掩码进行比较:

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

为什么两者?

&表达式求值为与其操作数相同的类型,在这种情况下为CGEventFlags,这可能不适合BOOL的大小,即signed char 1}}。 ==表达式将其解析为1或0,这将适合BOOL

该问题的其他解决方案包括否定值两次(!!)并将变量声明为bool_Bool而不是BooleanBOOL。当您包含stdbool.h时,C99的_Bool类型(与bool同义)强制其值为1或0,就像==!!解决方案一样。< / p>