【问题标题】:Is it possible to create a virtual IOHIDDevice from userspace?是否可以从用户空间创建虚拟 IOHIDDevice?
【发布时间】:2014-01-12 14:05:31
【问题描述】:

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

我突然想到,我可能可以编写一个后台用户空间应用程序,该应用程序占用物理设备并呈现另一个虚拟设备,并添加一些小的附加内容,以便导致每个报告的输入值发生变化(如环绕累加器,HID 规范支持——只有上帝知道为什么 Griffin 自己不这样做。)

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

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

有什么想法吗?

【问题讨论】:

    标签: macos hid iokit


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多