好了,我終於有東西(幾乎完全)功能。根據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