【发布时间】: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 个键盘。
-
一般来说,不。如果被报告,您可以查找设备序列号,但不能保证它是唯一的。
-
众所周知,廉价制造商不会费心将单个序列号编程到键盘和鼠标中。普通用户真的不在乎这个,很容易就会在制作成本上增加几分钱。