gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:24:53 25 4
gpt4 key购买 nike

设置事件点击后,我无法识别在给定 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com