鼠标,键盘和其他HID设备的唯一标识符

Unique Identifier for Mouse,Keyboard and other HID devices

本文关键字:唯一 标识符 HID 键盘 其他 鼠标      更新时间:2023-10-16

我有一个MFC应用程序,用于在窗口中查找设备的详细信息。USB 存储设备的 PnPID 在每个系统中都是唯一的。但在鼠标键盘的情况下,同一设备的每台计算机上的 PnPID 是不同的。有没有办法使用 C++ 查找鼠标、键盘和 HID 的唯一标识符。如果有人知道 HID 设备或鼠标和键盘的唯一标识符,请分享。这是我的代码。

while(SetupDiEnumDeviceInfo(hDevInfo,lCount++,&DevInfoData))
        {
            ///////////////////////////////////////
            DWORD   dwDataTypeHardwareid;
            LPTSTR  pszBufferHardwareid     = NULL;
            LPTSTR  pszBufferPnPid      = NULL;
            DWORD   dwBuffSizeHardwareid    = 0; 
            int     iRetValHardwareid       = 1;
            ///////////////////////////////////////
            iRetValHardwareid = SetupDiGetDeviceRegistryProperty(hDevInfo, &DevInfoData, SPDRP_HARDWAREID, &dwDataTypeHardwareid, (PBYTE)pszBufferHardwareid, dwBuffSizeHardwareid, &dwBuffSizeHardwareid);
            DWORD dwErr = GetLastError();
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                if (pszBufferHardwareid) 
                    LocalFree(pszBufferHardwareid);
                //// / //
                pszBufferHardwareid = (char *)LocalAlloc(LPTR,dwBuffSizeHardwareid * 2);
                iRetValHardwareid=SetupDiGetDeviceRegistryProperty(hDevInfo, &DevInfoData, SPDRP_HARDWAREID, &dwDataTypeHardwareid, (PBYTE)pszBufferHardwareid, dwBuffSizeHardwareid, &dwBuffSizeHardwareid);
            }       
            if(StrStrI(pszBufferHardwareid,"HID\"))
            {
                if(StrStrI(pszBufferClass,"Mouse"))
                {
                    CM_Get_Device_ID(DevInfoData.DevInst, pszBufferPnPid, MAX_PATH, 0); //**Not unique in different machines**
                    CString strDevid = (CString)pszBufferPnPid;
                    strDevid.Trim();
                    strDevid.MakeUpper();
                    SaveDeviceDetails(strDevid); //Method to save device details to DB
                }
            }
        }

由于OP澄清了他正在寻找HID设备的唯一标识符,我建议尝试使用设备序列号,尽管不能保证它是唯一的。

在 Win32 上,可以使用 HidD_GetSerialNumberString 函数检索 HID 设备的序列号。