5

我在 OS X 检测击键时遇到问题。每当按下键盘键时,我都需要检测按键按下和按键释放或按键向上。当使用[ NSEvent addLocalMonitorForEventsMatchingMask: handler: ]. 这使您可以拦截和修改NSEvent各种事件类型的 s,包括常规打印键,以及NSKeyUp可用于检测 shift、ctrl、alt 和 cmd 键的 s。事实上,由于 shift、ctrl、alt 和 cmd 键的上键和下键的修饰符标志都发生了变化,因此可以通过检查.NSKeyDownNSFlagsChangedNSFlagsChanged[NSEvent modifierFlags][NSEvent keyCode]

但是,Capslock 是不同的。因为 capslock 修饰符实际上只对按下的键起作用,所以当你按下 capslock 时,你只会得到一个NSFlagsChangedwith capslock 被按下,而不是在它被释放时。并且不会使用修饰键(如 capslock 和 shift 和 ctrl 等)发出NSKeyUpNSKeyDown

任何人都可以提出一种方法,甚至是较低级别的界面,来获取大写锁定键事件吗?我将不得不求助于使用 kqueues 或其他东西吗?

4

1 回答 1

3

IOHIDLib 似乎是这样做的唯一方法。我(或实际上是一个队友)使用 IOHIDManager 设置了一个事件回调,该回调成功拦截了 capslock key-up 和 key-down 事件。

可怕的是,这完全在 Cocoa/CoreFoundation 事件分派机制之外,这意味着即使您的应用程序失去焦点,您也会收到事件。你最终不得不自己做很多窗口管理和焦点检测。

但它确实有效。

于 2014-03-09T19:18:18.683 回答