【问题标题】:NSEvent modifier flags -- bug when both Shift and Caps-Lock are held down?NSEvent 修饰符标志 - 按住 Shift 和 Caps-Lock 时的错误?
【发布时间】:2011-11-15 19:54:39
【问题描述】:

我有一个 NSEvent 键盘挂钩回调。我正在查看事件的修饰符标志来判断字母是否应该大写。

当 Caps-Lock 打开并按住 shift 键时,您按下一个键...该键显示为大写字母,但 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;

所以,

-Caps-Lock 开启(灯亮)

-Shift 被按住

-点击[e]键

-输出为“E”

-但是上面代码的输出是FALSE FALSE。

使用移位或大写正确报告值。为什么不让他们两个都正确报告?如果他们两个都关闭了......为什么这个字母仍然是大写的?

如果由于某种原因这是正确的...除了按住 shift 和 caps 的按键之外,我如何区分正常的按键? (它们具有相同的 FALSE-FALSE 标志)

【问题讨论】:

    标签: objective-c macos cocoa


    【解决方案1】:

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

    if( flags & NSShiftKeyMask ){
    
    ...
    
    if( flags & NSAlphaShiftKeyMask ){
    

    【讨论】:

    • +1 FALSE FALSE 在这种情况下是正确的,因为当你同时有 caps lock 和 shift on 时,那么键盘的状态不是 only Shift 并且不是 仅大写锁定。 == 比较是检查这是否是确切的位掩码,而不是该特定位是否已设置。
    • 是的,就这么简单。非常感谢你们。
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多