Events 获取CGEvent轻触中按下的修改器键
设置事件点击后,我无法识别给定CGEvent时按下的修改器键Events 获取CGEvent轻触中按下的修改器键,events,macos,core-graphics,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");
CGEventFlags flagsP;
flagsP=CGEventGetFlags(event);
NSLog(@"flags: 0x%llX",flagsP);
NSLog(@"stored: 0x%llX",kCGEventFlagMaskCommand);
if (flagsP==kCGEventFlagMaskCommand) {
NSLog(@"command pressed");
}
给定上述代码段,第一个NSLog返回与第二个NSLog不同的值。毫不奇怪,当按下命令修改器键时,条件从未触发
我需要确定对于给定的CGEvent是否按下了command、alternate、option、control或shift。不过,首先,我需要帮助理解为什么上述方法不起作用
谢谢 这些是位掩码,它们将按位或合并到从
CGEventGetFlags
接收的值中(或在自己创建事件时传递)
这里不能测试相等性,因为没有一个位掩码等于多个位掩码的组合。您需要测试单个位的相等性
要从组合位掩码中提取单个位掩码的值,请使用按位AND(&
)运算符。然后,将其与您感兴趣的单位掩码进行比较:
BOOL commandKeyIsPressed = (flagsP & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand;
为什么两者都有
&
表达式的计算结果与其操作数的类型相同,在本例中为CGEventFlags
,它可能不适合BOOL
的大小,后者是有符号字符
。=
表达式将其解析为1或0,这是BOOL
中的全部内容
该问题的其他解决方案包括两次求反(
!!
),并将变量声明为bool
或\u bool
,而不是Boolean
或bool
。C99的\u Bool
类型(当包含stdbool.h时同义为Bool
)强制其值为1或0,就像==
和一样代码>解决方案可以。谢谢,彼得。这非常好地解释了它,解决了我的问题。非常感谢,你知道有没有办法检查是否有任何修改器被按下?或者我必须像这样对每一个进行明确检查吗?我这样做了,但不知道这是否是最好/最干净的方法<代码>布尔isModifierPressed=(标志和(kCGEventFlagMaskAlternate | KCGEVENTFLAGMASKCOMAND | KCGEVENTFLAGMASKCCONTROL | kCGEventFlagMaskShift))>0代码>@infensus:它不是<代码>>0
在这里是错误的,因为您的意思是不进行算术比较;你的意思是测试一组(隐喻性的)开关。如果您想知道是否有任何开关(位)处于打开状态,这是所有开关(位)是否都处于关闭状态的逻辑求反,因此您需要使用比较标志&(…)
是否不等于0=代码>。如果您想知道是否所有这些特定开关都已打开,请使用=
将标志和(…)
与同一组标志进行比较。