VS2010 USBHID 搜索只能搜索到键盘与鼠标 以及 HidD

xiaoxiao2021-02-28  25

我在网上查找了关于USBHID的代码,

问题我现在使用  

GUID hidGuid;

::HidD_GetHidGuid((LPGUID)&hidGuid);                      // 取HID设备GUID

获取出来的VID PID只有 鼠标跟键盘的 其他的都没有 其中 04CA 007D为鼠标 093a2510为键盘 (这时我还插了一个U盘跟无线接收器)

pDetail->DevicePath = 0x0122089c "\\?\hid#vid_04ca&pid_007d&mi_00#7&2d946604&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}" 

pDetail->DevicePath = 0x0122089c "\\?\hid#vid_04ca&pid_007d&mi_01&col01#7&1a6449c6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"

pDetail->DevicePath = 0x0122089c "\\?\hid#vid_04ca&pid_007d&mi_01&col02#7&1a6449c6&0&0001#{4d1e55b2-f16f-11cf-88cb-001111000030}"

pDetail->DevicePath = 0x0122089c "\\?\hid#vid_093a&pid_2510#6&26d1ac3e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"

后后来我估计网上的介绍将HUID改成固定的 DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); 下面是我改成 GUID_DEVINTERFACE_USB_DEVICE 之后检索出来的路径

pDetail->DevicePath = 0x006a4d74 "\\?\usb#vid_04ca&pid_007d#5&4e3c163&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}" (鼠标)

 

pDetail->DevicePath = 0x006a4d74 "\\?\usb#vid_093a&pid_2510#5&4e3c163&0&3#{a5dcbf10-6530-11d2-901f-00c04fb951ed}"(键盘)

 

pDetail->DevicePath = 0x006a4d74 "\\?\usb#vid_0951&pid_1666#60a44c425324b1b049960033#{a5dcbf10-6530-11d2-901f-00c04fb951ed}" (U盘)

 

pDetail->DevicePath = 0x006a4d74 "\\?\usb#vid_0bda&pid_0153#20120926571200000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}" (USB2.0-CRW)

 

pDetail->DevicePath = 0x006a4d74 "\\?\usb#vid_148f&pid_7601#1.0#{a5dcbf10-6530-11d2-901f-00c04fb951ed}"

(802.11 n WLAN)

其他的设备都搜索出来了 但是出现一个新的问题就是 所有的设备 HidD_GetAttributes这个方法都返回失败  if (!HidD_GetAttributes(hCom,&DevAttributes))   {   CloseHandle(hCom);   AfxMessageBox("Cannot get the parameters of the HID");   return 0;      } 获取不到HID参数,请大神帮帮我 之前(使用 GUID hidGuid 的时候这一步是可以成功的) 具体相关代码如下 CString path=""; CString pszDevicePath[24]; int nCount=0; //=================  枚举HID设备  ================= HDEVINFO hDevInfoSet; SP_DEVICE_INTERFACE_DATA ifdata;   PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail; BOOL bResult; //============================================================ //定义一个BOOL变量,保存函数调用是否返回成功 BOOL Result; //定义一个HIDD_ATTRIBUTES的结构体变量,保存设备的属性。 //用来保存读数据的设备句柄 HANDLE hReadHandle=INVALID_HANDLE_VALUE; //根据HidGuid来获取设备信息集合, //其中Flage参数设置为 DIGCF_INTERFACEDEVICE - 返回所有支持的设备。 //DIGCF_PRESENT 只返回当前存在的设备 //因为我们这里只查找已经连接上的设备 返回的句柄保存在hDevInfoSet中 //注意设备信息集合在使用完毕后,要使用函数 SetupDiDestroyDeviceInfoList销毁 //不然会造成内存泄漏 HANDLE hDevHandle; HIDD_ATTRIBUTES DevAttributes; GUID hidGuid; ::HidD_GetHidGuid((LPGUID)&hidGuid);                      // 取HID设备GUID // 取得一个该GUID相关的设备信息集句柄 hDevInfoSet = SetupDiGetClassDevs(&hidGuid,                // class GUID  NULL,                                                // 无关键字  NULL,                                                // 不指定父窗口句柄  DIGCF_INTERFACEDEVICE|DIGCF_PRESENT);                // 目前存在的设备 // 失败... if (hDevInfoSet == INVALID_HANDLE_VALUE) { return path; } // 申请设备接口数据空间 pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, 1024); if(pDetail==NULL) { SetupDiDestroyDeviceInfoList(hDevInfoSet);// 清理句柄 return path; } pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); bResult = TRUE; //然后对设备集合中每个设备进行列举,检查是否是我们要找的设备 //当找到我们指定的设备,或者设备已经查找完毕时,就退出查找 //首先指向第一个设备,即将nCount设置为0 // 设备序号=0,1,2... 逐一测试设备接口,到失败为止 while (bResult) { ifdata.cbSize = sizeof(ifdata); // 枚举符合该GUID的设备接口 bResult = ::SetupDiEnumDeviceInterfaces( hDevInfoSet,     // 设备信息集句柄 NULL,            // 不需额外的设备描述 &hidGuid,        // GUID (ULONG)nCount,     // 设备信息集里的设备序号 &ifdata);        // 设备接口信息 if (bResult) { //如果获取信息成功,则继续获取该设备的详细信息。在获取设备 //详细信息时 需要先知道保存信息需要多大的缓冲区,这通过 //第一次调用函数SetupDiGetInterfaceDeviceDetail来获取 //这时提供缓冲区和长度为NULL的参数,并提供一个用来保存需要多大缓冲区的变量  //也可以不用 // 取得该设备接口的细节(设备路径) bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet,    // 设备信息集句柄 &ifdata,        // 设备接口信息 pDetail,        // 设备接口细节(设备路径) 1024,            // 输出缓冲区大小 NULL,           // 不需计算输出缓冲区大小(直接用设定值) NULL);          // 不需额外的设备描述 if (bResult) { // 复制设备路径到输出缓冲区 pszDevicePath[nCount] = pDetail->DevicePath; //如果调用成功,则使用不带读写访问的CreateFile函数 //来获取设备的属性,包括VID PID 版本号等 //对于一些独占设备(列如USB键盘),使用读方式访问是无法打开的 //而使用不带读写访问的格式才可以打开这这些设备,从而获取设备的属性 hDevHandle=CreateFile(pDetail->DevicePathNULL, FILE_SHARE_READ|FILE_SHARE_WRITENULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //获取设备的属性并保存在DevAttributes结构体中  DevAttributes.Size=sizeof(SP_DEVICE_INTERFACE_DATA); Result=HidD_GetAttributes(hDevHandle, &DevAttributes);  temp.Format("Product ID:%d",_tcsstr((TCHAR*)pDetail->DevicePath,_T("")));   AddToInfOut(temp);       if (NULL != _tcsstr((TCHAR*)pDetail->DevicePath_T("vid_0951&pid_1666"))){//与目标的供应商ID VID 产品ID PID 进行比较   HANDLE hCom=CreateFile(pDetail->DevicePath,   GENERIC_WRITE,   FILE_SHARE_READ|FILE_SHARE_WRITE,    NULL,   OPEN_EXISTING,   FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,   NULL);   if(hCom!=INVALID_HANDLE_VALUE)   {   AddToInfOut("写访问打开设备成功");   }else{   AddToInfOut("写访问打开设备失败");   }   if (!HidD_GetAttributes(hCom,&DevAttributes))   {   CloseHandle(hCom);   AfxMessageBox("Cannot get the parameters of the HID");   return 0;      }

转载请注明原文地址: https://www.6miu.com/read-2632362.html

最新回复(0)