我在 OS X 检测击键时遇到问题。每当按下键盘按键时,我需要检测按键按下和按键释放或按键按下。当使用 [ NSEvent addLocalMonitorForEventsMatchingMask: handler: ]
拦截应用程序的事件处理链时,这是相当简单的。这使您可以拦截和修改各种事件类型的 NSEvent
,包括用于常规打印键的 NSKeyUp
和 NSKeyDown
,以及 NSFlagsChanged
可用于检测 Shift、Ctrl、Alt 和 cmd 键。事实上,由于 Shift、ctrl、alt 和 cmd 键的键按下和键按下时修改标志都会发生变化,因此 NSFlagsChanged
可以用作这些键的键按下和键按下事件:检查 [NSEvent modifierFlags]
以及 [NSEvent keyCode]
。
不过,Capslock 是不同的。因为大写锁定修饰符实际上只在按下按键时起作用,所以当您按下大写锁定时,您只会在按下大写锁定时得到一个 NSFlagsChanged
,而不是在释放大写锁定时得到。并且 NSKeyUp
和 NSKeyDown
不会通过 capslock、shift 和 ctrl 等修饰键发出。
任何人都可以建议一种方法,甚至是较低级别的接口(interface),来获取大写锁定按键事件吗?我是否必须求助于使用 kqueues 或者其他东西?
最佳答案
IOHIDLib 似乎是执行此操作的唯一方法。我(或者实际上的队友)使用 IOHIDManager 设置了一个事件回调,成功拦截了大写锁定按键向上和向下按键事件。
可怕的是,这完全超出了 Cocoa/CoreFoundation 事件调度机制,这意味着即使您的应用程序失去焦点,您也会收到事件。您最终必须自己进行大量窗口管理和焦点检测。
但它确实有效。
关于macos - 如何检测 OS X 中大写锁定键的按下或释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12536356/