设置事件点击后,我无法识别在给定 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 是否按下了命令、替代、选项、控制或移位。首先,我需要帮助来理解为什么上面的方法不起作用。
Thanks!
这些是位掩码,它们将按位或运算一起变成您收到的值CGEventGetFlags
(或者自己创建事件时通过)。
您无法在这里测试相等性,因为没有一个位掩码等于多个位掩码的组合。您需要测试单个位的相等性。
要从组合位掩码中提取单个位掩码的值,请使用按位与 (&
) 操作员。然后,将其与您感兴趣的一位掩码进行比较:
BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand;
为什么两者都有?
The &
表达式的计算结果与其操作数的类型相同,即CGEventFlags
在这种情况下,它可能不适合 a 的大小BOOL
,这是一个signed char
. The ==
表达式将其解析为 1 或 0,这就是适合 a 的所有内容BOOL
.
该问题的其他解决方案包括两次否定该值(!!
)并将变量声明为bool
or _Bool
而不是Boolean
or BOOL
. C99's _Bool
类型(同义词为bool
当您包含 stdbool.h) 时,强制其值为 1 或 0,就像==
and !!
解决方案可以。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)