VS2010 USBHID 搜索只能搜索到键盘与鼠标 以及 HidD_GetAttributes返回失败的问题

我在网上查找了关于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;   
			  }


你可能感兴趣的:(vs2010)