设置事件点击后,我无法识别在给定 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 是否按下了命令、备用、选项、控制或移位。首先,我需要帮助来理解为什么上面的方法不起作用。
谢谢!
最佳答案
这些是位掩码,它们将按位或组合在一起成为您从 CGEventGetFlags 接收的值(或在自己创建事件时传递)。
您无法在此处测试相等性,因为没有一个位掩码会等于多个位掩码的组合。您需要测试单个位的相等性。
要从组合位掩码中提取单个位掩码的值,请使用按位与 (&
) 运算符。然后,将其与您感兴趣的一位掩码进行比较:
BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand;
为什么两者都有?
&
表达式的计算结果与其操作数的类型相同,在本例中为 CGEventFlags
,它可能不适合 BOOL< 的大小
,这是一个有符号字符
。 ==
表达式将其解析为 1 或 0,这是适合 BOOL
的所有内容。
该问题的其他解决方案包括对值取反两次 (!!
) 并将变量声明为 bool
或 _Bool
而不是 bool 值
或BOOL
。 C99 的 _Bool
类型(当您包含 stdbool.h 时,同义词为 bool
)强制其值为 1 或 0,就像 ==
和 !!
解决方案确实如此。
关于events - 获取 CGEvent Tap 中按下的修改键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4420995/