我有工作代码(在这里)捕获非修饰符keydown事件和修饰符更改事件的键码。
但是如果你这样做了:
LSHIFT down -> RSHIFT down -> RSHIFT up -> LSHIFT up
…内部操作不会触发这两个钩子,因为修饰符状态没有改变!
(编辑:糟糕!我应该在编写之前对其进行测试,因为实际上每次实际更改都会产生一个新的修改过的修饰符。
我唯一的想法可能是在更低的水平(这里)额外观看-但无论我从哪个角度看它都不好看。
摘自Justin Boo的回答
我添加了更多的修饰符,以防有人偶然发现这一点,并希望其他键。
- (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
,如LShiftDown
和RShiftDown
,因为这个方法应该在按下修饰符时调用。您可能还可以在keyDown
实现中检测此属性,以检测诸如"a"one_answers"a"之类的差异。