gpt4 book ai didi

windows - 获取 HID 设备的功能报告描述符的 native 方法?

转载 作者:可可西里 更新时间:2023-11-01 10:05:51 26 4
gpt4 key购买 nike

我们有一些与内部研发工具通信的HID 设备(触摸数字化仪)。此工具从设备解析原始功能报告以绘制触摸报告以及原始功能报告中存在但被 Windows 7 的 HID 驱动程序过滤掉的一些其他数据(例如,压力数据WM_TOUCH 消息中不存在)。

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

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

但是,在浏览 Windows API 时,我没能找到正确的调用方法来获取此描述符。到目前为止我发现的是 Raw Input page在 MSDN 上,但我不确定下一步该做什么。我可以在 RID_DEVICE_HID 中找到所需的信息吗?结构体 ?还是我需要调用一个完全不同的 API?

预先感谢您的帮助!

最佳答案

好吧,我终于得到了一些(几乎完全)可用的东西。据 mcoill 推断, 我使用了 HidP_xxx() 系列函数,但它需要先做一些数据准备。

我的解决方案基于这个 example code以 USB 操纵杆为目标,并使其适应触摸数字化仪设备。如果其他人也被在线文档弄糊涂了,这里是该过程中涉及的必需步骤:

  1. 在启动时为原始输入 设备注册应用程序。这是通过调用函数 RegisterRawInputDevice(&Rid, 1, sizeof(Rid)) 完成的,其中 Rid 是具有以下属性集的 RAWINPUTDEVICE (为了获得触摸数字化仪):

    Rid.usUsage = 0x04;
    Rid.usUsagePage = 0x0d;
    Rid.dwFlags = RIDEV_INPUT_SINK;
  2. 为事件 WM_INPUT 注册回调 OnInput(LPARAM lParam),因为 Rid 设备将生成此类事件;

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

准备好的数据被拆分成capabilities:

    // 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);

可以询问功能的值(value):

    // 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);

关于windows - 获取 HID 设备的功能报告描述符的 native 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26164195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com