enum usb device(zz)

来源:互联网 发布:科比高中数据 编辑:程序博客网 时间:2024/04/29 17:53

// DeviceManager.cpp : 定义控制台应用程序的入口点。

 

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

#include <setupapi.h>

#define DIRECTINPUT_VERSION 0x0800

#include <Dinput.h>

extern "C"

{

        #include <hidsdi.h>

}

#include <tchar.h>

#pragma comment(lib, "Dinput8.lib")

#pragma comment(lib, "Dinput.lib")

#pragma comment(lib, "Setupapi.lib") 

#pragma comment(lib, "hid.lib")

GUID myGuid;

LPDIRECTINPUT8 m_lpDI;         // DI8接口指针

 

LPDIENUMDEVICESCALLBACK DIEnumDevicesCallback(const DIDEVICEINSTANCE* lpddi, VOID* pvRef)

  *(GUID*) pvRef = lpddi->guidInstance;

 

 

  return DIENUM_STOP;   

}

 

int main(void)

{

        GUID HidGuid;

 

        // 查找本系统中HID类的GUID标识

        HidD_GetHidGuid(&HidGuid);

        printf("系统中HID类的GUID标识为:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x/n",

               HidGuid.Data1,HidGuid.Data2 ,HidGuid.Data3 ,

               HidGuid.Data4[0],HidGuid.Data4[1],HidGuid.Data4[2],

               HidGuid.Data4[3],HidGuid.Data4[4],HidGuid.Data4[5],

               HidGuid.Data4[6],HidGuid.Data4[7]);

 

        // 准备查找符合HID规范的USB设备

        HDEVINFO hDevInfo = SetupDiGetClassDevs(

                                &HidGuid,

                                NULL,

                                NULL,

                                DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

 

        if (hDevInfo == INVALID_HANDLE_VALUE)

        {

                printf("符合HID规范的USB设备发生错误 /n");

 

                return 0;

        }

 

        printf("正在查找可用的USB设备。。。。 /n");

 

        DWORD MemberIndex = 0;

        SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;

        BOOL bSuccess = FALSE;

 

        DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

        do

        {

                bSuccess = SetupDiEnumDeviceInterfaces(

                                        hDevInfo,

                                        NULL,

                                        &HidGuid,

                                        MemberIndex,

                                        &DeviceInterfaceData);

                if ((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS))

                {

                        if(MemberIndex == 0)

                        {

                                printf("抱歉,未找到可用的USB设备! /n");

                        }

                        else

                        {

                                printf("没有更多的可用的USB设备! /n");

                        }

                        SetupDiDestroyDeviceInfoList(hDevInfo);

                        return 0;

                }

 

                printf("找到了一个USB设备: /n");

                // 若找到了一个USB设备,则获取该设备的细节信息

                PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData;

                DWORD Length = 0;

 

                SetupDiGetDeviceInterfaceDetail(

                                hDevInfo,

                                &DeviceInterfaceData,

                                NULL,

                                0,

                                &Length,

                                NULL);

                pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);

                pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);  //MUST BE!!!

 

                if (!SetupDiGetDeviceInterfaceDetail(

                                        hDevInfo,

                                        &DeviceInterfaceData,

                                        pDeviceInterfaceDetailData,

                                        Length,

                                        NULL,

                                        NULL))

                {

                        printf("查找路径设备时出错! /n");

                }

                else

                {

                        printf("设备路径:%s ", pDeviceInterfaceDetailData->DevicePath);

                }

                //打开设备句柄

                HANDLE hDeviceHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath,

                                GENERIC_READ | GENERIC_WRITE,

                                FILE_SHARE_READ | FILE_SHARE_WRITE,

                                NULL,

                                OPEN_EXISTING,

                                0,

                                NULL);

                if (hDeviceHandle == INVALID_HANDLE_VALUE)

                {

                        printf("打开设备路径出错! /n");

                        // printf("%d", GetLastError());

                }

                else

                {

                        HIDD_ATTRIBUTES Attributes;

                        HidD_GetAttributes(hDeviceHandle,&Attributes);

 

   /**************************************************/

   /*

                        long result;

   int ReadBuffer[10];

   int flag;

   do

   {

    ReadBuffer[9] = 0;

    ReadBuffer[8] = 0;

    ReadBuffer[7] = 0;

    ReadBuffer[6] = 0;

    ReadBuffer[5] = 0;

    ReadBuffer[4] = 0;

    ReadBuffer[3] = 0;

    ReadBuffer[2] = 0;

    ReadBuffer[1] = 0;

    ReadBuffer[0] = 0;

   result = HidD_GetFeature(

     hDeviceHandle,

     (PVOID)ReadBuffer,

     0x09);

  // for (int i = 0; i < ReadBuffer[1]; i++)

   {

    //printf("%d", ReadBuffer[i]);

   } 

   }

 

   //scanf("%d", &flag);

   while(1);

   */

   HRESULT hr; 

   HINSTANCE hInstance = GetModuleHandle(NULL) ;//获取实例句柄;

 

   //建立DirectInput接口 

     if(NULL == m_lpDI) 

     {

         hr = DirectInput8Create(hInstance,

            DIRECTINPUT_VERSION, 

            IID_IDirectInput8, 

            (void**)&m_lpDI, //接口取值 

            NULL);

 

     hr = m_lpDI->EnumDevices(DI8DEVCLASS_GAMECTRL, 

                              (LPDIENUMDEVICESCALLBACK)DIEnumDevicesCallback,     //回调函数 

                                     &myGuid,           //赋值GUID 

                                            DIEDFL_ATTACHEDONLY);   //扫描安装好的和连接好的设备

 

     }

   /**************************************************/

                        //将有关该设备的标识显示出来

                        printf("供应商ID :0X%04X ",Attributes.VendorID);

                        printf("产品ID :0X%04X ",Attributes.ProductID);

                        printf("产品版本号:0X%04X ",Attributes.VersionNumber);

 

                        WCHAR mString[256];

                        TCHAR Buffer[256];

 

                        HidD_GetManufacturerString(hDeviceHandle,mString,sizeof(mString));

                        if (wcstombs((char *)Buffer,mString,256) == -1)  // fail

                        {

                                Buffer[0] = NULL;

                        }

                        printf("生产商: %s ",Buffer);

 

                        HidD_GetProductString(hDeviceHandle,mString,sizeof(mString));

                           if (wcstombs((char *)Buffer,mString,256) == -1)

                           {

                                Buffer[0] = NULL;

                           }

                           printf("产品名称: %s ",Buffer);

 

                           // 通信:

                           PHIDP_PREPARSED_DATA pHidpPreparsedData;

                           HIDP_CAPS hidPCaps;

                           if (!HidD_GetPreparsedData(hDeviceHandle, &pHidpPreparsedData))

                           {

                                printf("获取 HID PREPARED DATA 失败! /n");

                                return 0;

                           }

                           NTSTATUS status = HidP_GetCaps(pHidpPreparsedData,&hidPCaps);

                           if (status == HIDP_STATUS_SUCCESS)

                           {

                            printf("CAP信息如下: /n");

                            printf("     InputReportByteLength %d ", hidPCaps.InputReportByteLength);

                            printf("     OutputReportByteLength %d ", hidPCaps.OutputReportByteLength);

                           }

 

                        DWORD nReadBytes = 0;

                        BYTE *pInputReport = new BYTE[hidPCaps.InputReportByteLength];

                        memset(pInputReport,0,hidPCaps.InputReportByteLength);

 

                        do

                        { 

                                ReadFile(hDeviceHandle,

                                         pInputReport,

                                         hidPCaps.InputReportByteLength,

                                         &nReadBytes,

                                         NULL);

 

                                if (hidPCaps.InputReportByteLength == nReadBytes)

                                {

                                        for (unsigned int i = 0; i< nReadBytes - 1;i++)

                                        {

                                                printf("%02x-",pInputReport[i]);

                                        }

                                        printf("%02x ",pInputReport[nReadBytes-1]);

                                }

                               // if (pInputReport[nReadBytes-2] == 0x20)  //break the loop when pressing a specific key

                                {

                               //         printf(" /n");

                                        break;

                                }

                                Sleep(10);

                        }while (hidPCaps.InputReportByteLength == nReadBytes);

 

                        // 释放句柄资源

                        CloseHandle(hDeviceHandle);

                }

 

                MemberIndex++;

        }while(bSuccess);

        SetupDiDestroyDeviceInfoList(hDevInfo);

 

        return 0;

}

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 月子臀部大腿疼困怎么办 产后抱孩子腰疼怎么办 剖腹产后5年小肚子很大怎么办 压力大工作忙瘦了怎么办? 哺乳乳房一大一小怎么办 哺乳期乳房一大一小怎么办 上班之后奶少了怎么办 出了月子还流恶露怎么办? 剖腹产2年刀疤痒怎么办 刨宫产6天伤口痒怎么办 脸的皮肤油油的怎么办 狗狗子宫蓄脓怎么办 刮宫后子宫壁薄怎么办 产妇有痔疮怎么办很疼 二胎着床在剖腹产切口怎么办 刨腹产3月后怀孕怎么办 破腹产两年了肚子还是很大怎么办 抛妇产后肚子大怎么办 破腹产后想大便怎么办 破腹产后肚子硬怎么办 在月子里同房了怎么办 胃变大凸出来了怎么办 坐完月子脊背疼怎么办 月子过后脊背疼该怎么办 怀孕的时候牙疼怎么办 练瑜伽后弯腰疼怎么办 练完瑜伽腰椎疼怎么办 瑜伽开髋动作受伤怎么办 才学瑜伽教培上课紧张怎么办 瑜伽馆不给退费怎么办 脚运动后酸痛该怎么办 婴儿误吞拉链头怎么办 肠功能蠕动慢便秘怎么办 胃肠型和蠕动波怎么办 胃不蠕动了怎么办偏方 喂母乳母亲奶头裂开怎么办 给宝宝吃奶被吃到奶头裂开怎么办 宝宝吃奶奶头裂开了怎么办 小孩吃奶奶头裂开了怎么办 站久坐久腰酸痛怎么办 孕39周胎儿头小怎么办