#include <dbt.h> #include <wtypes.h> #include <sal_supp.h> #include <kernelspecs.h> #include <setupapi.h> extern "C"{ #include <hidsdi.h> } #pragma comment(lib,"hid.lib") #pragma comment(lib,"setupapi.lib") BOOL EnumHIDDevice(WORD uVID, WORD uPID, //USB VID PID BOOL bPresentFlag, //设备必须存在标志 0不需要插入设备 TCHAR szDevPath[MAX_PATH+1] = NULL, //设备路径 int iIndex=0) //第N个设备 (对多个相同的设备进行区分) { BOOL bRet = FALSE; int iFoundCount = 0; //查找到匹配设备个数 GUID HidGuid; HidD_GetHidGuid(&HidGuid); DWORD dwFlage = DIGCF_DEVICEINTERFACE; if(bPresentFlag) dwFlage |= DIGCF_PRESENT; HDEVINFO hdev = SetupDiGetClassDevs(&HidGuid, NULL, NULL, dwFlage); if (INVALID_HANDLE_VALUE != hdev) { int idev = 0; while(! bRet) { SP_DEVICE_INTERFACE_DATA did = {0}; did.cbSize = sizeof(did); if (SetupDiEnumDeviceInterfaces(hdev, 0, &HidGuid, idev, &did)) { DWORD cbRequired = 0; SetupDiGetDeviceInterfaceDetail(hdev, &did, 0, 0, &cbRequired, 0); if (ERROR_INSUFFICIENT_BUFFER == GetLastError()) { PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, cbRequired); if (pdidd) { pdidd->cbSize = sizeof(*pdidd); if (SetupDiGetDeviceInterfaceDetail(hdev, &did, pdidd, cbRequired, &cbRequired, 0)) { TRACE(_T("\n%s\n"), pdidd->DevicePath); // Enumerated a battery. Ask it for information. HANDLE hDevHandle = CreateFile(pdidd->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != hDevHandle) { // Ask the battery for its tag. HIDD_ATTRIBUTES hidAttributes = {0}; hidAttributes.Size = sizeof(hidAttributes); if (HidD_GetAttributes(hDevHandle, &hidAttributes)) { if( hidAttributes.VendorID == uVID && hidAttributes.ProductID == uPID) { WCHAR szManufacturer[MAX_PATH+1]={0}; WCHAR szProduct[MAX_PATH+1]={0}; WCHAR szSerialNumber[MAX_PATH+1]={0}; HidD_GetManufacturerString(hDevHandle, szManufacturer, MAX_PATH); HidD_GetProductString(hDevHandle, szProduct, MAX_PATH); HidD_GetSerialNumberString(hDevHandle, szSerialNumber, MAX_PATH); TRACE(_T("Manufacturer string=%s\n"), (LPCTSTR)CString(szManufacturer)); TRACE(_T("Product string=%s\n"), (LPCTSTR)CString(szProduct)); TRACE(_T("SerialNumber=%s\n"), (LPCTSTR)CString(szSerialNumber)); if(iFoundCount == iIndex) { if(szDevPath) { _tcscpy_s(szDevPath, MAX_PATH, pdidd->DevicePath); } bRet = TRUE; } iFoundCount++; } } CloseHandle(hDevHandle); } else { DWORD dwErr = GetLastError(); TRACE(_T("CreateFile failed with code %lu\n"), dwErr); } } else { DWORD dwErr = GetLastError(); TRACE(_T("SetupDiGetDeviceInterfaceDetail failed with code %lu\n"), dwErr); } LocalFree(pdidd); } } } else if (ERROR_NO_MORE_ITEMS == GetLastError()) { break; // Enumeration failed - perhaps there are no more items } idev++; //for next device } SetupDiDestroyDeviceInfoList(hdev); } return bRet; }
//测试代码 TCHAR szDevPath[MAX_PATH+1] = {0}; if(EnumHIDDevice(0x046d, 0xC018, TRUE, szDevPath)) { ::MessageBox(NULL, szDevPath, _T("Hid Device"), MB_OK); }