【问题标题】:Unique Identifier for Mouse,Keyboard and other HID devices鼠标、键盘和其他 HID 设备的唯一标识符
【发布时间】:2018-04-13 09:35:29
【问题描述】:

我有一个 MFC 应用程序,用于在 windows 中查找设备的详细信息。 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
                }
            }
        }

【问题讨论】:

  • VID:PID 组合对于一台特定设备应保持不变,无论来自 PC。但是,您的目标到底是什么?您是否需要每个设备的唯一标识符(也就是说,即使您购买了两个相同的键盘,它们也应该有不同的 ID)还是只想区分型号?
  • @S.Monteleone。如果我买了 2 个相同的键盘,那么有任何唯一标识符可以区分这 2 个键盘。
  • 一般来说,不。如果被报告,您可以查找设备序列号,但不能保证它是唯一的。
  • 众所周知,廉价制造商不会费心将单个序列号编程到键盘和鼠标中。普通用户真的不在乎这个,很容易就会在制作成本上增加几分钱。

标签: c++ windows mfc usb mouse


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 2018-08-23
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多