如何在OS X中检测大写锁定密钥的密钥或密钥释放?

时间:2012-09-21 18:41:18

标签: macos cocoa keyboard appkit nsevent

我遇到OS X检测击键的问题。每当按下键盘键时,我需要检测一个键和一个键释放或键。当使用[ NSEvent addLocalMonitorForEventsMatchingMask: handler: ]拦截应用程序的事件处理链时,这是相当直接的。这样,您就可以拦截和修改各种事件类型NSEvent,包括常规打印键的NSKeyUpNSKeyDown,以及可用于NSFlagsChanged的{​​{1}}检测shift,ctrl,alt和cmd键。实际上,因为shift键,ctrl键,alt键和cmd键的键向上键和键键都有变化,NSFlagsChanged可以通过检查{[NSEvent modifierFlags]作为这些键的键向上键和键击事件。 {1}}以及[NSEvent keyCode]

但是,Capslock是不同的。因为大写锁定修饰符实际上只对按键有效,所以按下大写时你只会按下NSFlagsChanged并按下大写锁定,而不是在它被释放时。并且NSKeyUpNSKeyDown不会使用修饰键(如capslock,shift和ctrl等)发出。

任何人都可以建议一种方法,甚至可能是更低级别的界面,以获取大写锁定密钥事件?我不得不求助于使用kqueues或其他东西吗?

1 个答案:

答案 0 :(得分:3)

IOHIDLib似乎是这样做的唯一方法。我(或实际上是一个队友)使用IOHIDManager来设置一个事件回调,成功截获了大写字母加密和按键事件。

可怕的是,这完全在Cocoa / CoreFoundation事件调度机制之外,这意味着即使应用程序失焦也能获得事件。您最终必须自己进行大量的窗口管理和焦点检测。

但确实有效。