我有一个设计有点不幸的 HID 设备(Griffin Powermate),因为当你转动它时,“旋转轴”HID 元素的输入值不会改变,除非速度旋转的急剧变化或除非方向改变。它发送许多 HID 报告(角度分辨率似乎约为 4 度,因为我每次旋转得到约 90 份报告 - 不是很好,但无论如何...),但它们都报告相同的值(通常CCW 和 CW 分别为 -1 或 1——如果你转得更快,它会报告 -2 和 2,依此类推,但你必须转得更快很多。由于这种不幸的行为,我发现这东西基本上没用。
我突然想到,我也许可以编写一个后台用户空间应用程序,该应用程序会占用物理设备并呈现另一个虚拟设备并添加一些小的内容,以便为每个报告导致输入值更改(如环绕累加器,HID 规范支持它——天知道为什么 Griffin 自己不这样做。)
但我没有看到如何从用户空间为虚拟设备创建内核端对象,我开始认为这可能是不可能的。我看到了this question , 它的适应症不好,但细节不多。
或者,如果我有办法在现有设备上欺骗报告,我想也可以这样做,因为我可以在它报告 -1 或 1 后立即将其设置回零。
有什么想法吗?
最佳答案
首先,你可以通过Quartz Event Services来模拟输入事件但这可能不足以满足您的目的,因为它主要是为模拟键盘和鼠标事件而设计的。
其次,IOKit 框架的 HID 驱动程序系列在(全局)IOHIDResource
服务上包含一个用户客户端,称为 IOHIDResourceDeviceUserClient
。看起来这可以根据用户空间的命令生成 IOHIDUserDevice
实例。特别是,用户空间 IOKitLib 包含一个 IOHIDUserDeviceCreate
函数,它似乎应该能够做到这一点。 HID 系列源代码甚至带有一点 demo of this which creates a virtual keyboard各种各样的。不幸的是,虽然我可以构建它,但它在调用 IOHIDUserDeviceCreate
时失败了。 (我可以在 IORegistryExplorer 中看到 IOHIDResourceDeviceUserClient
实例从未创建。)由于时间不够,我没有对此进行进一步调查,但如果您需要它的功能,似乎值得一试。
关于macos - 是否可以从用户空间创建虚拟 IOHIDDevice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21075561/