如何为OS X中的Capslock键检测向上键或释放键?

Ted*_*ton 5 keyboard macos cocoa nsevent appkit

我在OS X检测按键时遇到问题。每当按下键盘键时,我都需要检测按键按下,释放或按键释放。当使用拦截应用程序的事件处理链时,这非常简单[ NSEvent addLocalMonitorForEventsMatchingMask: handler: ]。这样,您可以截取和修改NSEvents的各种事件类型,包括NSKeyUpNSKeyDown常规打印键,以及NSFlagsChanged可用于检测shift,ctrl,alt和cmd键的s 。事实上,由于修正标志更改两个关键起来为Shift,Ctrl,Alt和CMD键按下按键,NSFlagsChanged可以用来作为检查的重要上升,键按下事件对于那些键[NSEvent modifierFlags]与一起[NSEvent keyCode]

但Capslock是不同的。因为capslock修饰符实际上仅作用于向下按下键,所以当您按下capslock时,只会获得NSFlagsChanged带有capslock的按下,而不是在释放时按下。并且NSKeyUpNSKeyDown不会与Capslock和shift和ctrl等修饰键一起发出。

任何人都可以建议一种方法,甚至可以使用较低级别的界面来获取capslock键启动事件吗?我是否将不得不使用kqueues或其他东西?

Ted*_*ton 4

IOHIDLib 似乎是执行此操作的唯一方法。我(或者实际上的队友)使用 IOHIDManager 设置了一个事件回调,成功拦截了大写锁定按键向上和向下按键事件。

可怕的是,这完全超出了 Cocoa/CoreFoundation 事件调度机制,这意味着即使您的应用程序失去焦点,您也会收到事件。您最终必须自己进行大量窗口管理和焦点检测。

但它确实有效。