1.先安装WDK
2.项目属性-》VC++目录
包含目录,顺序如下:
C:/WinDDK/7600.16385.1/inc/ddk
$(VCInstallDir)include
$(VCInstallDir)atlmfc/include
C:/WinDDK/7600.16385.1/inc/api
$(WindowsSdkDir)/include
$(FrameworkSDKDir)include
库目录添加 C:/WinDDK/7600.16385.1/lib/win7/i386
可执行目录添加c:\WinDDK\7600.16385.1\bin\x86
#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);
}