2014-01-12 60 views
3

我有一个有点不幸设计的HID设备(Griffin Powermate),因为在您打开它时,“Rotation Axis”HID元素的输入值不会改变,除非旋转速度急剧变化或除非方向改变。它发送了许多HID报告(角度分辨率似乎约为4deg,因为我每次旋转获得约90个报告 - 不是很好,但无论...),但它们都报告相同的值(通常为-1或1 CCW和CW分别 - 如果你转速更快,它会报告-2 & 2等等,但你必须更快地转动由于这种不幸的行为,我发现这个东西很大程度上没用。是否可以从用户空间创建虚拟IOHIDDevice?

我想到我可能能够编写一个后台用户空间应用程序,该应用程序占用了物理设备,并向另一个虚拟设备显示了一些小的添加项,以便为每个报告导致输入值更改(例如,这是HID规范支持的累积器 - 上帝只知道为什么格里芬没有)

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

另外,如果有一种方法,我欺骗现有设备上的报道,我想它会报告后,立即将做得一样好,因为我可以将其设置回零-1或1

有任何想法吗?

回答

3

首先,您可以通过Quartz Event Services模拟输入事件,但这可能不足以达到您的目的,因为这主要是为了模拟键盘和鼠标事件而设计的。

其次,IOKit框架的HID驱动程序系列包含(global)IOHIDResource服务上的用户客户端,名为IOHIDResourceDeviceUserClient。看起来这可以根据用户空间的命令产生IOHIDUserDevice实例。特别是,用户空间IOKitLib包含一个IOHIDUserDeviceCreate函数,这似乎应该能够做到这一点。 HID家族源代码甚至有一些demo of this which creates a virtual keyboard的种类。不幸的是,尽管我可以构建它,但它在IOHIDUserDeviceCreate调用中失败。 (我可以在IORegistryExplorer中看到从未创建过IOHIDResourceDeviceUserClient实例。)由于时间不够,我没有进一步调查,但如果需要它的功能,似乎值得追求。

相关问题