在 OS X 上独立捕获每个 SHIFT 键
Trap each SHIFT key independently on OS X
我有工作代码 () 可以捕获非修饰符按下事件和修饰符更改事件的键码。
但如果你这样做:
LSHIFT down -> RSHIFT down -> RSHIFT up -> LSHIFT up
...内部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
}
}
我建议在您的 class 中存储一些 BOOL
,例如 LShiftDown
和 RShiftDown
,因为在按下修饰符时应该调用此方法。您可能还可以在 keyDown
实现中检测此 属性 以检测 "a" 和 "A".
等差异
我有工作代码 (
但如果你这样做:
LSHIFT down -> RSHIFT down -> RSHIFT up -> LSHIFT up
...内部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
}
}
我建议在您的 class 中存储一些 BOOL
,例如 LShiftDown
和 RShiftDown
,因为在按下修饰符时应该调用此方法。您可能还可以在 keyDown
实现中检测此 属性 以检测 "a" 和 "A".