NSEvent修饰符标志 - 按住Shift和Caps-Lock时的错误?

cks*_*ubs 4 macos cocoa objective-c

我有一个NSEvent Keyboard钩子回调.我正在查看事件的修饰符标志,以判断该字母是否应该大写.

当大写锁定已开启并转移被按住了,你按一个键......那钥匙出来作为一个大写字母,但都SHIFTCAPS标志返回FALSE.

//For testing which flags are on.
//Holding down Shift and Caps for some reason = FALSE FALSE...
NSUInteger flags = [NSEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask;
if( flags == NSShiftKeyMask ){
    NSLog(@"Shift - TRUE");
} else {
    NSLog(@"Shift - FALSE");
}

if( flags == NSAlphaShiftKeyMask ){
    NSLog(@"CAPS - TRUE");
} else {
    NSLog(@"CAPS - FALSE");
}
return newUserKeypress;
Run Code Online (Sandbox Code Playgroud)

所以,

-Cap-Lock打开(指示灯亮)

-Shift被压制住了

- 点击[e]键

- 输出为"E"

- 上面代码的输出为FALSE FALSE.

使用shift OR caps正确报告值.为什么没有正确报告它们?如果它们都关闭了......为什么这封信仍然被大写?

如果出于某种原因这是正确的......除了按住按键和按下按键之外,我怎么能告诉正常的按键呢?(它们具有相同的FALSE-FALSE标志)

Wev*_*vah 11

你不想使用==,你需要使用按位运算符:

if( flags & NSShiftKeyMask ){

...

if( flags & NSAlphaShiftKeyMask ){
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,+1 FALSE FALSE是正确的,因为当你同时拥有大写锁定和移位时,键盘的状态不仅仅是*Shift而不是*仅*大写锁定.`==`比较是检查是否是确切的位掩码,而不是该特定位是否设置. (6认同)