Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在OS X上独立捕获每个SHIFT键_Macos_Hook_Keyboard Events_Tap_Iokit - Fatal编程技术网

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

Macos 在OS X上独立捕获每个SHIFT键,macos,hook,keyboard-events,tap,iokit,Macos,Hook,Keyboard Events,Tap,Iokit,我有一个工作代码()用于捕获非修改器keydown事件和修改器更改事件的键代码 但如果你这样做了: LSHIFT down -> RSHIFT down -> RSHIFT up -> LSHIFT up 。。。内部2个动作不会触发这两个钩子中的任何一个,因为修改器状态没有改变 (编辑:Woops!我应该在写之前测试一下,因为实际上每次实际更改都会产生一个新的修改器。) 我唯一的想法可能是在更低的层次上观看()——但无论从哪个角度看,这都不好看。摘自Justin Boo的答案

我有一个工作代码()用于捕获非修改器keydown事件和修改器更改事件的键代码

但如果你这样做了:

LSHIFT down -> RSHIFT down -> RSHIFT up -> LSHIFT up
。。。内部2个动作不会触发这两个钩子中的任何一个,因为修改器状态没有改变

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


我唯一的想法可能是在更低的层次上观看()——但无论从哪个角度看,这都不好看。

摘自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
s,例如
lshift down
rshift down
,因为在按下修改器时应该调用此方法。您可能还可以在
keyDown
实现中检测此属性,以检测差异,如“a”和“a”。

否,它们有单独的键码——我通过执行第二个链接中的代码确认了这一点。假设您正在制作一个带有Obj-C(给定OSX标记)的Cocoa应用程序,您可以使用该代码。执行
-(void)标记更改:(n事件*)
并检查
[theEvent修饰符]
。L档为131330,R档为131332@Arc676啊,你这个笨蛋!我刚刚测试过,它确实正确地隔离了L&R转换事件。即使是复合材料,如+L+R-L-R和+L+R-R-L。如果你把它作为一个答案,我会很高兴地接受它。