首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取HID设备的特征报告描述符的原生方法?

获取HID设备的特征报告描述符的原生方法?
EN

Stack Overflow用户
提问于 2014-10-02 15:25:25
回答 2查看 4.1K关注 0票数 3

我们有一些HID设备,(触摸数字化器),与内部研发工具通信。该工具解析设备的原始特性报告,以绘制触摸报告和一些附加数据,这些数据存在于原始特性报告中,但被Windows 7的HID驱动程序过滤掉(例如,压力数据不存在于WM_TOUCH消息中)。

然而,我们已经开始使用一些设备,这些设备可能有不同的固件变体,因此不共享相同的字段排序或字节,我需要修改我们的研发工具,以便它能够透明地适应所有的设备。

这些设备来自同一个制造商(我们自己),并且共享相同的设备信息,因此使用这些字段来区分不同的固件不是一种选择。我想要做的是,获取设备发送的HID特性报告描述符,并根据这些信息动态更新我们的特性报告解析方法。

但是,在浏览Windows时,我没有找到要调用的正确方法来获取这个描述符。到目前为止,我发现的是MSDN上的原始输入页,但我不知道下一步该做什么。我能在HID结构中找到所需的信息吗?还是我需要调用一个完全不同的API?

提前感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-19 09:05:53

好的,我终于有了(几乎完全)功能的东西。根据麦考尔的推断,我使用了HidP_xxx()系列函数,但它首先需要一些数据准备。

我的解决方案是基于这个示例代码,它的目标是USB操纵杆,并将其用于触摸数字化设备。如果其他人也被在线文档搞糊涂了,下面是这个过程中所需的步骤:

  1. 在启动时注册原始输入设备的应用程序。这是通过调用函数RegisterRawInputDevice(&Rid, 1, sizeof(Rid))来完成的,其中Rid是一个具有以下属性集的RAWINPUTDEVICE (为了获得触摸数字化器): Rid.usUsage = 0x04;Rid.usUsagePage = 0x0d;Rid.dwFlags = RIDEV_INPUT_SINK;
  2. 为事件OnInput(LPARAM lParam)注册回调WM_INPUT,因为Rid设备将生成这种类型的事件;
  3. OnInput(LPARAM lParam)方法将分两个步骤从该事件获取数据: //分析原始输入头以读取其大小。UINT bufferSize;GetRawInputData(HRAWINPUT)lParam,RID_INPUT,NULL,&bufferSize,sizeof(RAWINPUTHEADER);//为原始输入数据分配内存并检索其PRAWINPUT = (PRAWINPUT)HeapAlloc(GetProcessHeap(),0,bufferSize);GetRawInputData(GetProcessHeap(),0,bufferSize);GetRawInputData(HRAWINPUT)lParam,RID_INPUT,rawInput /* NULL */,&bufferSize,sizeof(RAWINPUTHEADER);
  4. 然后调用一个解析方法,该方法创建查找函数所需的HIDP_PREPARSED_DATA结构: //再次读取数据大小,然后分配,然后检索GetRawInputDeviceInfo(rawInput->header.hDevice,RIDI_PREPARSEDDATA,NULL,&bufferSize);PHIDP_PREPARSED_DATA preparsedData =(PHIDP_PREPARSED_DATA)HeapAlloc(堆,0,bufferSize);

准备好的数据被分割成capabilities

代码语言:javascript
运行
复制
    // 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);

功能可以被要求提供它们的价值:

代码语言:javascript
运行
复制
    // 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);
票数 4
EN

Stack Overflow用户

发布于 2014-10-22 15:46:36

HidP_GetPReparsedData(...),HidP_GetValueCaps(HidP_Feature,.)他们的同类可以给你足够的信息而不必得到原始的特征报告?

MSDN上的HIDClass支持例程

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26164195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档