我们有一些 HID设备(触摸数字转换器)与内部研发工具进行通信。此工具从设备中解析原始要素报告以绘制触摸报告以及原始要素报告中存在但由Windows 7的HID驱动程序过滤掉的一些其他数据(例如,压力数据)在WM_TOUCH
消息中不存在。
但是,我们已经开始使用可能具有不同固件变体的某些设备,因此不会共享相同的字段排序或字节长度,我需要修改我们的R& D工具,以便它可以透明地适应所有设备。
这些设备来自同一制造商(我们自己)并共享相同的设备信息,因此使用这些字段来区分不同的固件不是一种选择。我想要做的是获取设备发送的HID功能报告描述符,并根据此信息动态更新我们的功能报告解析方法。
但是,我没有设法在浏览Windows API时找到正确的方法来获取此描述符。到目前为止我发现的是MSDN上的Raw Input page,但我不确定下一步该怎么做。我可以在RID_DEVICE_HID结构中找到所需信息吗?或者我是否需要调用完全不同的API?
提前感谢您的帮助!
答案 0 :(得分:2)
好的,最后我有一些(几乎完全)功能。正如mcoill推断的那样,我使用了HidP_xxx()
系列函数,但它首先需要进行一些数据准备。
我的解决方案基于此example code,针对USB操纵杆,并将其调整为触摸数字转换器设备。 如果其他人也对在线文档感到困惑,则以下是此过程中涉及的必要步骤:
在启动时注册原始输入设备的应用程序。
这是通过调用函数RegisterRawInputDevice(&Rid, 1, sizeof(Rid))
完成的,其中Rid
是RAWINPUTDEVICE
,并设置了以下属性(为了获得触摸数字化仪):
Rid.usUsage = 0x04;
Rid.usUsagePage = 0x0d;
Rid.dwFlags = RIDEV_INPUT_SINK;
为事件OnInput(LPARAM lParam)
注册回调WM_INPUT
,因为Rid
设备会生成此类事件;
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));
然后调用一个解析方法来创建查找函数所需的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);
答案 1 :(得分:1)
不会 HidP_GetPReparsedData ( ... ), HidP_GetValueCaps ( HidP_Feature,... )和他们的同事为您提供了足够的信息,而无需获得原始功能报告?