【发布时间】:2012-09-25 16:46:48
【问题描述】:
我正在尝试编写一个简单的命令行程序,它将给定键盘上的击键发送到 UDP 服务器。我正在使用IOKit 框架及其IOHIDManager 类在OSX 上编程。
就我的程序而言,我想在打开IOHIDManager 实例并使用IOHIDManagerRegisterInputValueCallback 在回调设置中发送UDP 消息时使用kIOHIDOptionsTypeSeizeDevice。
当我通过 IOHIDManagerSetDeviceMatching 函数设置过滤以匹配我的 MacBook Pro 的内部键盘时,一切正常:按键不再传递到焦点应用程序,事件通过 UDP 正确发送。
当我尝试匹配 USB CardReader (http://www.gitak.com/GIT-200USB.PDF) 时,一切正常,直到刷卡时设备发送的第一个事件。在第一个字符之后,不再调用注册的回调。
更准确地说:
- 设备匹配正确(即使多次拔掉电源)
- 正确处理第一个接收到的字符
- 设备有一个 LED 来指示它何时准备好进行新的滑动,通常在滑动后它会变回绿色,但在这种情况下,在发送第一个事件后,它会保持关闭状态
- 使用带有
kIOHIDOptionsTypeSeizeDevice的内部键盘时,一切正常 - 在使用带有
kIOHIDOptionsTypeNone而不是kIOHIDOptionsTypeSeizeDevice的读卡器时,一切都按预期工作(即使事件仍传递给焦点应用程序) - 在变得无响应后,拔下并重新插入设备会重复上述行为
- 程序以 root 权限运行
比较简单的程序可以在这里找到:
https://gist.github.com/3783042
如何修改它,以免在发送第一个事件后导致读卡器无响应?
【问题讨论】:
-
这几乎就是我为我的 MagTech 阅读器所做的。如果你插上它并在没有驱动程序的情况下刷卡,它会键入密钥吗?另外,您是否尝试过 IOHIDDeviceRegisterInputValueCallback?那是我用来代替 IOHIDManagerRegisterInputValueCallback 的。它应该按照您的方式工作。
-
@ThaneNorton 是的,没有驱动程序一切正常。我没有尝试过设备本身的回调,但我开始怀疑这是设备的错(它很便宜:D)。