调研一台电脑连接两个键盘如何区分遇到的问题及解决方法

本文探讨了在Windows系统中如何区分并管理连接的多个键盘问题。通过研究API,尤其是GetRawInputData和GetRawInputDeviceInfo函数,发现使用RIDI_DEVICENAME参数可以获取设备实例路径,从而实现键盘的唯一标识。即使键盘拔插,设备实例ID依然保持不变,为解决此问题提供了有效方案。
摘要由CSDN通过智能技术生成

1.查找windows API 手册,调用GetRawInputData函数,可以获得按下的键值VKey以及唯一的句柄hDevice,但是hDevice并不能直观的对应不同键盘而且每当拔下键盘,重新插入的时候hDevice会发生变化。
2.继续查找发现可以通过GetRawInputDeviceInfo函数,找到按键所对应的具体来源。函数第一个参数是设备句柄,第二个参数根据想要获得的内容填写,一开始我在第二个参数填写的是RIDI_DEVICEINFO,发现获得数值无法区分不同设备。
3.后来经过测试,填写RIDI_DEVICENAME,即读取设备名,能找出不同设备的区别,后经过对应,得到的是设备管理器对应出的设备实例路径,由此确定了唯一,并且拔下键盘后再插上,deviceName没有发生改变。

附上代码
(获取按键同时得到的信息)

::GetRawInputData((HRAWINPUT)lParam, RID_INPUT, &rawinputData, &uiSize, sizeof(RAWINPUTHEADER));
    if (RIM_TYPEKEYBOARD == rawinputData.header.dwType)
    {
   
        // WM_KEYDOWN --> 普通按键    WM_SYSKEYDOWN --> 系统按键(指的是ALT)
        if ((WM_KEYDOWN == rawinputData.data.keyboard.Message) ||
                (WM_SYSKEYDOWN == rawinputData.data.keyboard.Message))
        {
   
            qDebug() << "keyboard.VKey ==" << (QChar)rawinputData.data.keyboard.VKey;
            qDebug() << "header.hDevice" << rawinputData.header.hDevice;
            
            UINT bufferSize;//为键盘设备名准备缓冲区大小
            ::GetRawInputDeviceInfo(rawinputData.header.hDevice, RIDI_DEVICENAME, NULL, &bufferSize);
            WCHAR* RawDevName = new WCHAR[bufferSize];
            ::GetRawInputDeviceInfo(rawinputData.header.hDevice, RIDI_DEVICENAME, RawDevName, &bufferSize);//将设备名读入缓冲区RawDevName
            QString devName = QString::fromWCharArray(RawDevName);
            qDebug() << "dev ===" << devName;
            delete[] RawDevName;
            
            
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值