在OS X上独立捕获每个SHIFT键

时间:2015-05-22 10:14:03

标签: macos hook keyboard-events tap iokit

我有工作代码(here),用于捕获非修饰符keydown事件和修饰符更改事件的密钥代码。

但如果你这样做:

LSHIFT down -> RSHIFT down -> RSHIFT up -> LSHIFT up

...内部2动作不会触发这些挂钩,因为修饰符状态不会改变!

(编辑:Woops!我应该在写之前对其进行测试,因为实际上每次实际更改都会产生一个新的修饰符更改。)

我唯一想到的可能是在更低的水平(here)进行额外观察 - 但无论从哪个角度来看,它看起来都不是很好。

1 个答案:

答案 0 :(得分:2)

取自Justin Boo的回答here

我添加了一些修饰符以防万一有人偶然发现并想要其他键。

- (void) flagsChanged:(NSEvent*)theEvent{
    if ([theEvent modifier] == 131330){
        //do stuff regarding left shift
    }else if ([theEvent modifier] == 131332){
        //do stuff regarding right shift
    }else if ([theEvent modifier] == 65792){
        //caps lock is on
    }else if ([theEvent modifier] == 8388864){
        //FN key pressed
    }else if ([theEvent modifier] == 262401){
        //control key pressed
    }else if ([theEvent modifier] == 524576){
        //option key pressed
    }else if ([theEvent modifier] == 1048840){
        //command key pressed
    }else if ([theEvent modifier] == 256){
        //there are no modified pressed and caps lock is off
    }
}

我建议在您的班级中存储一些BOOL,例如LShiftDownRShiftDown,因为在按下修改器时应调用此方法。您也可以在keyDown实施中检测此属性,以检测“a”和“A”之类的差异。