2014-10-02 184 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); 
相关问题