日期:2014-05-17  浏览次数:21041 次

关于枚举USB的问题
再调用SetupDiEnumDeviceInterfaces函数的时候,只返回1次,这1次返回的是我的USB鼠标,我插上去的U盘认不到。
代码如下:(Win32Usb是封装好的访问API类)
string strPath = string.Empty;
string strSearch = string.Format("vid_{0:x4}&pid_{1:x4}", nVid, nPid); // first, build the path search string
Guid gHid = Win32Usb.HIDGuid;//(返回HidD_GetHidGuid的GUID)

IntPtr hInfoSet = Win32Usb.SetupDiGetClassDevs(ref gHid, null, IntPtr.Zero, Win32Usb.DIGCF_DEVICEINTERFACE | Win32Usb.DIGCF_PRESENT);

try
  {
  while (true)
  {
  Boolean result = Win32Usb.SetupDiEnumDeviceInterfaces(hInfoSet, 0, ref gHid, (uint)nIndex, ref oInterface);
  if (!result)
  {
  Console.WriteLine("枚举失败! : " + Marshal.GetLastWin32Error());
  }
  else
  {
  Console.WriteLine("枚举成功!");
  }
  nIndex++;
  }
 }
 catch (Exception ex)
 {
  throw HIDDeviceException.GenerateError(ex.ToString());
  //Console.WriteLine(ex.ToString());
 }
 finally
 {
  // Before we go, we have to free up the InfoSet memory reserved by SetupDiGetClassDevs
  Win32Usb.SetupDiDestroyDeviceInfoList(hInfoSet);
  }

------解决方案--------------------
注意U盘不是HID设备,使用HidD_GetHidGuid得到的GUID不能用于枚举U盘,你试一下DiskClassGuid或UsbClassGuid
另外,枚举U盘的话,其实不一定要用DDK,可以用WM_DEVICECHANGE获得U盘插入通知,用WMI也可以取得相关的设备信息