我在网上查找了关于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->DevicePath, NULL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, 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; }