是否可以从用户空间创建虚拟IOHIDDevice?

时间:2014-01-12 14:05:32

标签: macos hid iokit

我有一个有点不幸设计的HID设备(Griffin Powermate),当你转动它时,“旋转轴”HID元素的输入值不会改变,除非速度旋转显着改变或除非方向改变。它发送了许多 HID报告(角度分辨率似乎约为4deg,因为我每次旋转得到~90个报告 - 不是很好,但无论如何......),但它们都报告相同的值(通常CCW和CW分别为-1或1 - 如果转得更快,它将报告-2& 2,依此类推,但你必须更快地转动很多。由于这个不幸行为,我发现这件事基本没用。

在我看来,我可能能够编写一个后台用户空间应用程序,该应用程序占用了物理设备并呈现了另一个虚拟设备,其中包含一些小的添加内容,从而导致每个报告的输入值发生变化(如环绕累积器,HID规范支持 - 上帝只知道格里芬为什么不自己这样做。)

但是我没有看到如何从用户空间为虚拟设备创建内核端对象,我开始认为这可能是不可能的。我看到了this question,它的迹象并不好,但细节很少。

或者,如果我有办法在现有设备上欺骗报告,我想也会这样做,因为我可以在报告-1或1后立即将其设置为零。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

首先,您可以通过Quartz Event Services模拟输入事件,但这可能不足以满足您的需要,因为它主要用于模拟键盘和鼠标事件。

其次,IOKit框架的HID驱动程序系列在(全局)IOHIDResource服务上包含一个名为IOHIDResourceDeviceUserClient的用户客户端。看来这可以在用户空间的命令上生成IOHIDUserDevice个实例。特别是,用户空间IOKitLib包含IOHIDUserDeviceCreate函数,似乎应该能够执行此操作。 HID系列源代码甚至带有一点demo of this which creates a virtual keyboard种类。不幸的是,虽然我可以建立它,但它在IOHIDUserDeviceCreate调用失败了。 (我可以在IORegistryExplorer中看到IOHIDResourceDeviceUserClient实例永远不会被创建。)由于时间不够,我没有进一步调查这个问题,但如果你需要它的功能,它似乎值得追求。