c中的原始输入winapi,无法获取设备信息

时间:2011-03-13 06:07:09

标签: c winapi

我正在使用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;

}

2 个答案:

答案 0 :(得分:1)

当您致电GetRawInputDeviceInfo时,它希望pcbSize成为指针。你有它作为指针,但它没有指向任何东西。试试这个:

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

    [编辑]

    另外,你应该对puiNumDevices做同样的事情。而是创建一个名为UINT的{​​{1}}。使用函数期望指针的uiNumDevices

答案 1 :(得分:0)

我将在这里走出困境,并猜测这件事实际上可能是一个HID设备。你知道吗?

HID设备实际上很容易交谈;你通过CreateFile()连接它们 - 就像你打开一个COM端口一样 - 然后只是ReadFile()来获取数据。

大多数问题是找出正确的连接路径。它实际上是一个名为DevicePath的值,您可以从SetupDiGetDeviceInterfaceDetail()获得。

它的粗略地图如下所示:

HidD_GetHidGuid()获取HID指导   SetupDiGetClassDevs()获取开发列表   通过开发人员循环,直到找到你的开头:

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

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