2014-10-02 77 views
1

我們有一些HID設備(觸摸數字化儀),其與一個內部研究& d工具通信。此工具解析原始特徵報告從設備繪製觸摸報告與存在於原始功能報告,但由Windows 7的HID驅動過濾掉一些額外數據一起(例如,壓力數據中不存在WM_TOUCH消息)。獲取HID設備的功能報告描述符的原生方法?

但是,我們已經開始使用一些可能具有不同固件版本的設備,因此它們不具有相同的字段順序或字節長度,我需要修改我們的R工具,以便它能夠透明地進行調整到所有設備。

器件來自同一個製造商(自己)和共享相同的裝置信息,因此使用這些字段中的不同固件之間進行區分是不是一個選項。我想這樣做是爲了得到由設備發送的HID功能報告描述,並動態更新我們的專題報道基於此信息分析方法。

但是,我沒能找到正確的方法,以便瀏覽Windows API的時候能得到這個描述符來調用。我目前發現的是MSDN上的Raw Input page,但我不確定接下來要做什麼。我可以在RID_DEVICE_HID結構中找到所需的信息嗎?或者我需要調用完全不同的API?

在此先感謝您的幫助!

回答

1

豈不HidP_GetPReparsedData...),HidP_GetValueCapsHidP_Feature,...)之流給你足夠的信息,而不必獲取原始特徵報告?

HIDClass Support Routines on MSDN

+0

是的,這是我的猜測太多。我之前找到了HidP_GetPreparsedData(),但被HidP_GetValueCaps()弄糊塗了。儘管如此,我仍然需要在示例應用程序(或者我們的工具的開發分支)中找到時間來嘗試它。一旦完成,我會更新問題。 – sansuiso 2014-10-22 20:19:53

1

好了,我終於有東西(幾乎完全)功能。根據mcoill的推測,我使用了HidP_xxx()系列函數,但它首先需要一點數據準備。

我根據我對這個example code靶向USB操縱桿的解決方案,並適應它觸控數字設備。 如果其他人也得到由在線文檔迷惑,這裏是參與這一進程所需的步驟:

  1. 登記在推出原始輸入設備的應用程序。

    Rid.usUsage = 0x04; 
    Rid.usUsagePage = 0x0d; 
    Rid.dwFlags = RIDEV_INPUT_SINK; 
    
  2. 註冊一個回調OnInput(LPARAM lParam)以來的Rid設備的事件WM_INPUT: 這是通過調用函數RegisterRawInputDevice(&Rid, 1, sizeof(Rid)),其中Rid是設置以下屬性的RAWINPUTDEVICE(爲了獲得觸控數字)來完成會產生這種類型的事件;

  3. 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);