我正在尝试编写一个简单的命令行程序,它将给定键盘上的击键发送到 UDP 服务器。我正在使用IOKit
框架及其IOHIDManager
类在 OSX 上编程。
就我的程序而言,我想kIOHIDOptionsTypeSeizeDevice
在打开IOHIDManager
实例并在回调设置中发送 UDP 消息时使用IOHIDManagerRegisterInputValueCallback
.
当我通过该功能设置过滤IOHIDManagerSetDeviceMatching
以匹配我的 MacBook Pro 的内部键盘时,一切正常:按键不再传递到焦点应用程序,并且事件通过 UDP 正确发送。
当我尝试匹配 USB 读卡器(http://www.gitak.com/GIT-200USB.PDF)时,一切正常,直到刷卡时设备发送的第一个事件。在第一个字符之后,不再调用注册的回调。
更准确地说:
- 设备匹配正确(即使多次拔出)
- 正确处理第一个接收到的字符
- 该设备有一个 LED 来指示它何时准备好进行新的滑动,通常在滑动后它会变回绿色,但在这种情况下,在发送第一个事件后,它会保持关闭
- 使用内部键盘时,一切都按预期工作
kIOHIDOptionsTypeSeizeDevice
- 将读卡器与
kIOHIDOptionsTypeNone
而不是一起使用时,一切都按预期工作kIOHIDOptionsTypeSeizeDevice
(即使事件仍传递给焦点应用程序) - 在变得无响应后,拔下并重新插入设备会重复描述的行为
- 该程序以root权限运行
相对简单的程序可以在这里找到:
https://gist.github.com/3783042
如何修改它以不导致读卡器在发送第一个事件后变得无响应?