MFC学习——获取所有键盘
获取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& 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;elsereturn TRUE;
}
示例
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
