macos - 如何检测 OS X 中大写锁定键的按下或释放?

标签 macos cocoa keyboard appkit nsevent

我在 OS X 检测击键时遇到问题。每当按下键盘按键时,我需要检测按键按下和按键释放或按键按下。当使用 [ NSEvent addLocalMonitorForEventsMatchingMask: handler: ] 拦截应用程序的事件处理链时,这是相当简单的。这使您可以拦截和修改各种事件类型的 NSEvent,包括用于常规打印键的 NSKeyUpNSKeyDown,以及 NSFlagsChanged 可用于检测 Shift、Ctrl、Alt 和 cmd 键。事实上,由于 Shift、ctrl、alt 和 cmd 键的键按下和键按下时修改标志都会发生变化,因此 NSFlagsChanged 可以用作这些键的键按下和键按下事件:检查 [NSEvent modifierFlags] 以及 [NSEvent keyCode]

不过,Capslock 是不同的。因为大写锁定修饰符实际上只在按下按键时起作用,所以当您按下大写锁定时,您只会在按下大写锁定时得到一个 NSFlagsChanged ,而不是在释放大写锁定时得到。并且 NSKeyUpNSKeyDown 不会通过 capslock、shift 和 ctrl 等修饰键发出。

任何人都可以建议一种方法,甚至是较低级别的接口(interface),来获取大写锁定按键事件吗?我是否必须求助于使用 kqueues 或者其他东西?

最佳答案

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

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

但它确实有效。

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

相关文章:

objective-c - 如何在 OSX 上以编程方式打开和关闭蓝牙、wifi 和声音

macos - Android Studio - ADB启动服务器失败,adbkey检查失败

objective-c - DDHotKey - 跟踪而不取消事件

python - 从 Objective-C 调用 Python

iphone - 在特定时间 x 天后创建 NSDate

macos - 以编程方式向 Mac 添加/删除工作区

Android - 在用户启用输入法后关闭 IME 设置 Activity

安卓键盘不显示

javascript - 输入输入时检查 INSERT 模式是否打开

CoreAudio 输入渲染回调从外部音频接口(interface) Mac OS 10.14 Mojave 渲染全 0