我的主要目标是通过代码启用/禁用USB蓝牙连接的加密狗设备。
现在我以这种方式查询设备:
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_PnPEntity");
foreach (ManagementObject queryObj in searcher.Get())
{
if (queryObj["Caption"] != null && queryObj["Caption"].ToString().Contains("(COM"))
{
if(queryObj["Caption"] != null)
{
string caption = queryObj["Caption"].ToString();
string[] portNames = SerialPort.GetPortNames();
foreach (var port in portNames)
{
if(caption.Contains(port))
{
settings.PortName = port;
break;
}
}
}
if (queryObj["HardwareID"] != null)
{
string[] hardwareID = queryObj["HardwareID"] as string[];
// set our hardwareID
settings.HardwareID = hardwareID.FirstOrDefault();
}
if (queryObj["ClassGuid"] != null)
{
Guid classGuid = Guid.Parse(queryObj["ClassGuid"].ToString());
// set our guid
settings.Guid = classGuid;
}
}
}
我想将其存储在本地数据库中以便启用/禁用设备时使用。我正在遵循此post上可接受的答案来处理启用/禁用功能。但是,单步执行此代码时,它与我最初查询设备时提取的硬件ID不匹配。
以下是处理比较的代码:
// Find the index of the particular DeviceInfoData for the instanceId.
private static int GetIndexOfInstance(SafeDeviceInfoSetHandle handle, DeviceInfoData[] diData, string instanceId)
{
const int ERROR_INSUFFICIENT_BUFFER = 122;
for (int index = 0; index <= diData.Length - 1; index++)
{
StringBuilder sb = new StringBuilder(1);
int requiredSize = 0;
bool result = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
if (result == false && Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER)
{
sb.Capacity = requiredSize;
result = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
}
if (result == false)
throw new Win32Exception();
if (instanceId.Equals(sb.ToString()))
{
return index;
}
}
// not found
return -1;
}
SetupDiGetDeviceInstanceId仅基于初始查询返回的classGuid返回1个结果,因此,我假设这是正确的设备,只是要与之比较的错误ID。
我已经了解到,设备实例ID可能因操作系统而异,但是,如果我要查询同一台计算机上的设备,那么hardwareID是否应保持一致?
初始查询的HardwareID :“ FTDIBUS \ COMPORT&VID_0403&PID_6001”
实例ID :“ FTDIBUS \ VID_0403 + PID_6001 + A506WQGGA \ 0000”
操作系统:Windows 10
两个值之间有明显的相似性,但是由于它们不相同,因此继续失败。我对这方面一点都不熟悉,所以任何帮助都会很棒。