我在OS X检测按键时遇到问题。每当按下键盘键时,我都需要检测一个按键按下,一个键释放或一个按键向上。当使用[ NSEvent addLocalMonitorForEventsMatchingMask: handler: ]拦截应用程序的事件处理链时,这非常简单。这样,您就可以截取和修改各种事件类型的NSEvent,包括常规打印键的NSKeyUpNSKeyDown以及可以用于检测shift,ctrl,alt和cmd键的NSFlagsChanged。实际上,由于修饰符标志同时改变了Shift,Ctrl,Alt和Cmd键的向上键和向下键,因此可以通过检查NSFlagsChanged[NSEvent modifierFlags]来将[NSEvent keyCode]用作这些键的向上键和向下键事件。 。

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

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

最佳答案

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

可怕的是,这完全超出了Cocoa/CoreFoundation事件分配机制的范围,这意味着即使您的应用程序不在焦点上,您也可以获得事件。您最终不得不自己做很多窗口管理和焦点检测。

但这确实有效。

关于macos - 如何检测OS X中的Capslock键的向上键或释放键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12536356/

10-09 02:21