寻求一种通用方式从C#中读取HID设备的报告

时间:2018-02-11 13:05:12

标签: c# windows usb hid

首先,关于我想要做的事情的一点背景 我是IOWrapper的作者,这个库允许您使用任意API(DirectInput,XInput,RawInput等)读取输入(键盘,鼠标,操纵杆等)和发送输出(键盘,鼠标,虚拟操纵杆等)所有都通过标准化的界面。

可以通过向IOWrapper添加MEF插件(我们称之为“提供者”)来支持新形式的IO,并且一个Provider通常包装一个API,例如DirectInput提供者可以枚举和读取DI设备,vJoy提供者可以控制虚拟vJoy棍等。
所有IOWrapper都关心的是具有输入(或输出)的设备,它们看起来像是按钮,轴(操纵杆样式绝对或鼠标样式相对)或POV(“帽子开关”)。
我们的应用程序的GUI前端(UCR)可以完全不了解API等 - 它只关注将按钮映射到按钮等。

我正在研究为USB HID编写提供程序的可能性(仅在第一次输入时),因为有些设备似乎通过HID公开了它们的所有功能,但是更高级的Windows API要么看不到设备或以有限的容量看到它们 例如,“DS4”(Playstation 4)控制器上有一个触摸板,但是当通过DirectInput(或者说在joy.cpl中)查看时,可以使用常规轴和按钮,但不能使用触摸板。
另一个例子是3D鼠标,它通常具有绝对轴和相对轴的组合 - 这些似乎在HID级别完全暴露,但是例如你不会在游戏中看到它们作为DirectInput设备公开。

现在其中一些设备有USB HID实现(例如DS4Windows用于DS4焊盘),但我想尝试制作尽可能通用的东西,而不必为每个设备编写完整的实现。

我做了一些研究,在this page上,我得到的印象是,HID设备会公开您需要能够计算出它有多少个按钮/轴/ pov所需的所有信息,以及如何解释它的报告。
我想你会丢失按钮名称等信息(例如在DS4控制器上,你只得到“按钮1”,而不是“交叉”),但我想我们可以允许可选的XML文件给各种按钮命名 - 地狱即使它需要较小的编码(从一个类派生,覆盖一些东西),这也不会太糟糕。

因此,考虑到这个目标,我开始尝试编写一些POC代码 我首先尝试了hid-sharp,但示例似乎已被破坏 - devices[selectedDeviceIndex].serialNumber始终为0或null,我无法继续。

然后我尝试了NuGet包HIDSharp - 我能够从我的一个设备获得报告的1.5版本,但我认为无法找到描述符来解释如何解释这些值。

在2.0 alpha的测试应用中,它崩溃了以下代码:

/// <summary>
/// Returns the raw report descriptor of the USB device.
/// Currently this is only supported on Linux.
/// </summary>
/// <returns>The report descriptor.</returns>
public virtual byte[] GetReportDescriptor()
{
    throw new NotSupportedException(); // Windows without libusb can't... Linux can.
}

报告描述符似乎是我所追求的,所以我不知道如何继续这一点。如果有另一个依赖来做我想要的,那么很好,没问题,但即使满意,我也缺乏代码。

所以,我正在发表这篇文章,希望有人能指导我完成这个雷区,或者告诉我不要试图越过它。

似乎有很多代码,但很多代码似乎都没有在git repo上维护或托管。 HidSharp 2.0 alpha似乎可能朝着正确的方向前进,并且是最近的(2017年12月),所以我希望很快就会实现。我可能会对所涉及的一些开发人员进行ping操作,看看我是否能得到他们的意见。

0 个答案:

没有答案