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

the*_*kid 3 macos events core-graphics

设置事件点击后,我无法确定在给定CGEvent的情况下按下了哪个修改键.

 CGEventFlags flagsP;

 flagsP=CGEventGetFlags(event);

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

 if (flagsP==kCGEventFlagMaskCommand) {
       NSLog(@"command pressed");
    }
Run Code Online (Sandbox Code Playgroud)

给定上面的代码片段,第一个NSLog返回与第二个NSLog不同的值.毫不奇怪,当按下命令修饰键时,从不触发条件.

我需要确定是否按下给定CGEvent的命令,备用,选项,控制或移位.首先,我需要帮助才能理解上述原因无效.

谢谢!

Pet*_*sey 6

这些是位掩码,它们将按位或逐位进入您收到的值CGEventGetFlags(或在自己创建事件时传递).

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

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

BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand;
Run Code Online (Sandbox Code Playgroud)

两个为什么?

&表达式评估为相同类型的操作数,这是CGEventFlags在这种情况下,这可能不适合于的大小BOOL,这是一个signed char.所述==表达可以消除该为1或0,这是所有,将适合在一个BOOL.

该问题的其他解决方案包括否定值两次(!!)并将变量声明为bool或者_Bool而不是BooleanBOOL.C99的_Bool类型(异名来bool当你包括stdbool.h)强制其值为1或0,就像==!!解决方案做.