Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 获取CGEvent轻触中按下的修改器键_Events_Macos_Core Graphics - Fatal编程技术网

Events 获取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");

设置事件点击后,我无法识别给定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是否按下了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=。如果您想知道是否所有这些特定开关都已打开,请使用
=
标志和(…)
与同一组标志进行比较。