【问题标题】:Raw input winapi in c, can't get device infoc中的原始输入winapi,无法获取设备信息
【发布时间】:2011-03-13 06:07:08
【问题描述】:

我正在使用 USB RFID 扫描仪并尝试使用 raw input 读取输入,到目前为止我有这个

#define _WIN32_WINNT 0x0601
#include <windows.h>
#include <stdio.h>

int main(void)
{
    PRAWINPUTDEVICELIST pRawInputDeviceList;
    PUINT puiNumDevices, pcbSize;
    UINT cbSize = sizeof(RAWINPUTDEVICELIST);
    char *pData[1000];

    GetRawInputDeviceList(NULL, puiNumDevices, cbSize);    
    pRawInputDeviceList = malloc(cbSize * *puiNumDevices);   
    GetRawInputDeviceList(pRawInputDeviceList, puiNumDevices, cbSize);

    // gives a correct RIM_TYPE for all devices 0-7 (GetRawInputDeviceList returns 8 devices for me)
    printf("%I32u\n", pRawInputDeviceList[0].dwType); 


    GetRawInputDeviceInfo(pRawInputDeviceList[1].hDevice, RIDI_DEVICENAME, pData, pcbSize);

    // gives a huge number (garbage?), should be the length of the name
    printf("%u\n", pcbSize);        

    // "E" in my case
    printf("%s\n", pData);

    // error 87, apparently ERROR_INVALID_PARAMETER
    printf("%I32u\n", GetLastError()); 

    return 0;

}

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    当您调用GetRawInputDeviceInfo 时,它期望pcbSize 是一个指针。你有它作为一个指针,但它没有指向任何东西。试试这个:

    1. 摆脱pcbSize(无处不在)。
    2. 创建一个变量UINT cbDataSize = 1000。这是您的 pData 数组的大小。
    3. 对于GetRawInputDeviceInfo 的最后一个参数,使用&amp;cbDataSize。这里取cbDataSize的地址,地址是一个指针。
    4. printf("%u\n", pcbSize); 更改为printf("%u\n", cbDataSize);

    看看这对你有什么作用。

    [编辑]

    另外,你应该对puiNumDevices 做同样的事情。相反,创建一个名为 uiNumDevicesUINT。在函数需要指针的地方使用&amp;uiNumDevices

    【讨论】:

      【解决方案2】:

      我打算在这里冒险并猜测这东西实际上可能是一个 HID 设备。你知道是不是吗?

      HID 设备实际上很容易交谈;您通过 CreateFile() 连接到它们——与打开 COM 端口的方式相同——然后只需 ReadFile() 即可获取数据。

      大部分问题在于找出正确的连接路径。它实际上是您从 SetupDiGetDeviceInterfaceDetail() 获得的名为 DevicePath 的值。

      它的粗略地图如下所示:

      HidD_GetHidGuid() 获取 HID guid
      SetupDiGetClassDevs() 获取 dev 列表
      遍历开发者,直到找到你的:

      • SetupDiEnumDeviceInterfaces() 枚举设备接口
      • SetupDiGetDeviceInterfaceDetail() 获取详细信息
      • CreateFile() 使用详细信息中的 DevicePath 打开设备。
      • HidD_GetAttributes 获取 vendorid 和 productid 以查看它是否是您的设备。

      如果是,请记住它,并使用 ReadFile() 获取数据。

      【讨论】:

        猜你喜欢
        • 2012-12-16
        • 2018-09-26
        • 1970-01-01
        • 2019-12-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多