本机方式获取HID设备的function报告描述符?

我们有一些HID设备 (触摸数字化仪)与内部研发工具进行通信。 该工具parsing来自设备的原始特征报告 ,以便绘制触摸报告以及一些额外的数据,这些数据存在于原始特征报告中,但由Windows 7的HID驱动程序过滤掉(例如,压力数据在WM_TOUCH消息中不存在) 。

但是,我们已经开始使用一些可能具有不同固件版本的设备,因此不能共享相同的字段顺序或字节长度,我需要修改我们的研发工具,以使其能够透明地适应所有设备。

设备来自同一制造商(我们)并共享相同的设备信息,因此使用这些字段来区分不同的固件是不可行的。 我想要做的就是获取设备发送的HID特性报告描述符 ,并基于此信息dynamic更新我们的特性报告parsing方法。

但是,我没有设法find正确的方法来调用浏览Windows API时得到这个描述符。 我到目前为止发现的是MSDN上的Raw Input页面 ,但我不确定接下来要做什么。 我可以在RID_DEVICE_HID结构中find所需的信息吗? 或者我需要调用一个完全不同的API?

在此先感谢您的帮助!

不会HidP_GetPReparsedData ), HidP_GetValueCapsHidP_Feature,… )及其种族给你足够的信息,而不必得到原始特征报告?

HIDClass支持程序在MSDN上

好吧,最后我有一些(几乎完全)功能。 根据mcoill的推断,我使用了HidP_xxx()系列函数,但是首先需要一点数据准备。

我以我的解决方案为基础的示例代码 ,其目标是USB游戏杆,并将其调整为触摸数字化设备。 如果其他人也对在线文档感到困惑,请参阅以下步骤:

  1. 在启动时注册原始输入设备的应用程序。 这是通过调用函数RegisterRawInputDevice(&Rid, 1, sizeof(Rid)) ,其中Rid是具有以下属性的RAWINPUTDEVICE (为了获得触摸数字化仪):

     Rid.usUsage = 0x04; Rid.usUsagePage = 0x0d; Rid.dwFlags = RIDEV_INPUT_SINK; 
  2. 由于Rid设备将生成这种类型的事件,因此注册事件WM_INPUT的回调OnInput(LPARAM lParam)

  3. OnInput(LPARAM lParam)方法将OnInput(LPARAM lParam)获取来自该事件的数据:

     // Parse the raw input header to read its size. UINT bufferSize; GetRawInputData(HRAWINPUT)lParam, RID_INPUT, NULL, &bufferSize, sizeof(RAWINPUTHEADER)); // Allocate memory for the raw input data and retrieve it PRAWINPUT = (PRAWINPUT)HeapAlloc(GetProcessHeap(), 0, bufferSize); GetRawInputData(HRAWINPUT)lParam, RID_INPUT, rawInput /* NOT NULL */, &bufferSize, sizeof(RAWINPUTHEADER)); 
  4. 然后调用一个解析方法来创建查找函数所需的HIDP_PREPARSED_DATA结构:

     // Again, read the data size, allocate then retrieve GetRawInputDeviceInfo(rawInput->header.hDevice, RIDI_PREPARSEDDATA, NULL, &bufferSize); PHIDP_PREPARSED_DATA preparsedData = (PHIDP_PREPARSED_DATA)HeapAlloc(heap, 0, bufferSize); GetRawInputDeviceInfo(rawInput->header.hDevice, RIDI_PREPARSEDDATA, preparsedData, &bufferSize); 

预先准备好的数据被分解成能力

  // Create a structure that will hold the values HidP_GetCaps(preparsedData, &caps); USHORT capsLength = caps.NumberInputValueCaps; PHIDP_VALUE_CAPS valueCaps = (PHIDP_VALUE_CAPS)HeapAlloc(heap, 0, capsLength*sizeof(HIDP_VALUE_CAPS)); HidP_GetValueCaps(HidP_Input, valueCaps, &capsLength, preparsedData); 

而功能可以被要求提供他们的价值:

  // Read sample value HidP_GetUsageValue(HidP_Input, valueCaps[i].UsagePage, 0, valueCaps[i].Range.UsageMin, &value, preparsedData, (PCHAR)rawInput->data.hid.bRawData, rawInput->data.hid.dwSizeHid);