events - 获取 CGEvent Tap 中按下的修改键

标签 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 是否按下了命令、备用、选项、控制或移位。首先,我需要帮助来理解为什么上面的方法不起作用。

谢谢!

最佳答案

这些是位掩码,它们将按位或组合在一起成为您从 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/

相关文章:

c# - 在 datepicker c# Winforms 上引发验证事件

python - 导入错误 : No module named scapy. 所有

objective-c - 在 OS X 中打开和创建窗口

macos - Haskell gtk 安装类型冲突

ios - 随机移动应用图标生成算法

java - 如何发出两个形状接触的事件信号? java

java - 在 JavaFX 中显式定位节点

ios - 如何让 UILabel 显示带轮廓的文本?

c# - 将具有多个事件参数的 VB.NET 事件转换为 C#

ios - 如何获得Arc积分?