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<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;
}

示例

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值