获取pc机上的设备需要用到设备安装类api
关于设备安装类
微软定义了许多常用设备安装类型,只有IHVs 和OEMs 可以增加定义。每种设备安装类型对应一个GUID。
设备安装类在设备管理器中的位置,如下图
右键设备可以查看设备安装类和设备安装类GUID
设备安装类GUID在注册表中的位置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class
设备安装类GUID的头文件是Devguid.h,可以看到比如键盘的设备安装类定义是GUID_DEVCLASS_KEYBOARD
设备接口类
设备接口类没有找到类似设备安装类那么直观的实体……
设置接口类GUID在注册表中的位置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses
设备接口类GUID的头文件是独立的,比如,
鼠标是Ntddmou.h,鼠标的设备接口类guid定义为GUID_DEVINTERFACE_MOUSE ;
键盘是ntddkbd.h,键盘的设备接口类guid定义为 GUID_DEVINTERFACE_KEYBOARD 。
设备信息集合
设备信息集合由设备信息元素组成,用于管理 属于 设备安装类、设备接口类 的设备。
本代码流程如下:
使用SetupDiGetClassDevs创建一个设备信息集合
之后调用SetupDiEnumDeviceInterfaces枚举设备信息集合中的设备接口
最后通过SetupDiGetDeviceInterfaceDetail获取设备接口的详情。比如这里准备获取的是键盘的设备路径,此设备路径与博文获取的设备路径一致。这样就可以判断是哪个键盘输入的了。可用于扫描枪等外设,这类外设一般把自己定义成一个键盘设备
关键代码
BOOL GetKBDevicePath(list<CString>& listKB)
{
// 根据设备安装类GUID创建空的设备信息集合
HDEVINFO deviceInfoSet;
deviceInfoSet = SetupDiCreateDeviceInfoList(&GUID_DEVCLASS_KEYBOARD, NULL);
if (deviceInfoSet == NULL) return FALSE;
// 根据设备接口类GUID获取新的设备信息集合
HDEVINFO deviceInfoElements = SetupDiGetClassDevsEx(
&GUID_DEVINTERFACE_KEYBOARD,
NULL,
NULL,
DIGCF_DEVICEINTERFACE | DIGCF_PRESENT,
deviceInfoSet,
NULL,
NULL);
if (deviceInfoElements == NULL) return FALSE;
// 获取设备接口
uint32_t memberIndex = 0;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData = { 0 };
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
listKB.clear();
// 枚举所有键盘
while (SetupDiEnumDeviceInterfaces(deviceInfoElements,
NULL,
&GUID_DEVINTERFACE_KEYBOARD,
memberIndex++,
&deviceInterfaceData))
{
// 获取接口细节
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData = 0;
DWORD length;
BOOL ok = SetupDiGetDeviceInterfaceDetail(deviceInfoElements,
&deviceInterfaceData,
NULL, 0, &length, NULL);
DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(length);
DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (SetupDiGetDeviceInterfaceDetail(deviceInfoElements,
&deviceInterfaceData,
DeviceInterfaceDetailData,
length,
NULL,
NULL))
{
// 获取设备路径
listKB.push_back(DeviceInterfaceDetailData->DevicePath);
}
free(DeviceInterfaceDetailData);
DeviceInterfaceDetailData = 0;
}
SetupDiDestroyDeviceInfoList(deviceInfoElements);
if (listKB.size() == 0)
return FALSE;
else
return TRUE;
}