这里是我自己本人的思路,不一定是最好的方法,如果发现更好的方法我会再拿出来,当然如果你发现更好的方法的话可以留言告诉我。

我的思路是枚举USB设备,并且检查设备的兼容ID和硬件ID

枚举用到的方法包括 SetupDiGetClassDevs 和 SetupDiEnumDeviceInfo, 这两个方法可以在MSDN2008里面查到。

这里简单说明一下用法:

//获取设备信息句柄
HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL,L"USB" ,NULL,DIGCF_ALLCLASSES|DIGCF_PRESENT);

  
  
//获取设备信息数据
  
  
SP_DEVINFO_DATA deviceInfoData;
  
  
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  
  
for(int i = 0;SetupDiEnumDeviceInfo(hDevInfo,i,&deviceInfoData);i++) //对USB设备集进行枚举
   
   
{
  
  
	
   
   ....
  
  
}

上面是枚举USB设备的思路,下面讲一下如何分辨USB设备是否就是手机

这里我的思路是判断 兼容ID 和 硬件ID , 这两个ID可以在设备管理器中看得到如下(写这篇日志时我没有android手机,所以我截的图不是手机信息,只是告诉你这么一样东西,你可以自己插入手机试验一下):

 

有一部分手机直接判断 兼容ID 是否是"usb\\class_ff&subclass_42"即可,

但是有些手机的兼容ID不是这个串,那就比较麻烦了,需要匹配 硬件ID ,但是 硬件ID 不是固定的,好像是跟手机的硬件有关,但是同一款手机型号是一样的,有些品牌如vivo是一个系列都基本一样的硬件ID,甚至现在市面上的很多山寨手机直接就是用HTC的一个硬件ID(哈哈,那时候我去手机店采集硬件ID的时候就感概现在的山寨不硬件识别的ID都直接copy了,这个可能是商业问题,我也不懂.)

HDEVINFO句柄和SP_DEVINFO_DATA数据 调用 SetupDiGetDeviceRegistryProperty 方法:

WORD dataType= 0;
	DWORD buffSize = 0;
	SetupDiGetDeviceRegistryProperty(hDevInfo,&deviceInfoData,SPDRP_COMPATIBLEIDS,&dataType,NULL,buffSize,&buffSize);
	int err = GetLastError();
	if(err != ERROR_INSUFFICIENT_BUFFER)
		return; 
	LPTSTR szCompatibleID = (LPTSTR)LocalAlloc(LPTR,buffSize+1);
	SetupDiGetDeviceRegistryProperty(hDevInfo,&deviceInfoData,SPDRP_COMPATIBLEIDS,&dataType,(PBYTE)szCompatibleID ,buffSize,&buffSize);
	//szCompatibleID  即是兼容ID

如果 兼容ID != "usb\\class_ff&subclass_42" 那么就要匹配硬件ID了,获取硬件ID的方法和获取兼容ID的方法类似:

WORD dataType= 0;
	DWORD buffSize = 0;
	SetupDiGetDeviceRegistryProperty(hDevInfo,&deviceInfoData,SPDRP_HARDWAREID,&dataType,NULL,buffSize,&buffSize);
	int err = GetLastError();
	if(err != ERROR_INSUFFICIENT_BUFFER)
		return; 
	LPTSTR szHardwareID = (LPTSTR)LocalAlloc(LPTR,buffSize+1);
	SetupDiGetDeviceRegistryProperty(hDevInfo,&deviceInfoData,SPDRP_HARDWAREID,&dataType,(PBYTE)szHardwareID ,buffSize,&buffSize);
	//szHardwareID 即是硬件ID

硬件ID 的样子大概是: VID_1234&PID_4321  (1234,4321根据设备有差异,其中VID代表Vendor ID(厂家ID) , PID代表Product ID(产品ID)),VID基本一个厂商. 这个需要收集,但是网上好像有一些VID_PID大全可以满足一般使用.

(其中VID只能判断厂商,有些手机生产商也有别的设备产品,好像索尼有手机也有相机,所以不能轻判哦.

OK,手机判断完成,后面是驱动安装的介绍,手机插入后不一定有驱动,需要有驱动才能进行PC操作手机的功能.