好了,我终于有东西(几乎完全)功能。根据mcoill的推测,我使用了HidP_xxx()
系列函数,但它首先需要一点数据准备。
我根据我对这个example code靶向USB操纵杆的解决方案,并适应它触控数字设备。 如果其他人也得到由在线文档迷惑,这里是参与这一进程所需的步骤:
登记在推出原始输入设备的应用程序。
Rid.usUsage = 0x04;
Rid.usUsagePage = 0x0d;
Rid.dwFlags = RIDEV_INPUT_SINK;
注册一个回调OnInput(LPARAM lParam)
以来的Rid
设备的事件WM_INPUT
: 这是通过调用函数RegisterRawInputDevice(&Rid, 1, sizeof(Rid))
,其中Rid
是设置以下属性的RAWINPUTDEVICE
(为了获得触控数字)来完成会产生这种类型的事件;
的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);
是的,这是我的猜测太多。我之前找到了HidP_GetPreparsedData(),但被HidP_GetValueCaps()弄糊涂了。尽管如此,我仍然需要在示例应用程序(或者我们的工具的开发分支)中找到时间来尝试它。一旦完成,我会更新问题。 – sansuiso 2014-10-22 20:19:53