【发布时间】:2020-08-24 09:52:38
【问题描述】:
我正在实现一个场景,我应该在插入 USB 插槽后立即使用它。15 是我想要的。
插入第一个 USB 后,代码工作正常。当我在插入第一个 USB 后 1 分钟之前插入第二个 Usb 时,我没有得到已插入的第二个 Usb 的任何信息。我将向您展示处理插槽信息检索的代码。此方法在插入 USB 时触发事件后执行。
主要的事情:我必须等待超过 1 分钟,然后我可以插入第二个 USB 并占用插槽。如果我在第一个插入后等待 1 分钟之前插入它,我不会获取最后插入的 USB 的任何信息。
static int GetPhysicalPort()
{
try
{
devices = new List<USBDeviceInfo>();
ManagementObjectCollection collection;
using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnPSignedDriver WHERE DeviceId LIKE 'USB\\VID%' AND Description = 'USB Mass Storage Device' "))
{
collection = searcher.Get();
searcher.Dispose();
}
foreach (var device in collection)
{
devices.Add(new USBDeviceInfo(
(string)device.GetPropertyValue("DeviceId"),
(string)device.GetPropertyValue("Description"),
(string)device.GetPropertyValue("Location")
));
}
collection.Dispose();
string LastAdded = devices[0].Location.Substring(6, 4);
Console.WriteLine(LastAdded);
return Convert.ToInt32(LastAdded);
}
catch (Exception e)
{
Console.WriteLine(e);
return 0;
}
【问题讨论】:
-
您的意思是您可以获得两个 USB 设备的触发事件,但
GetPropertyValue为第二个设备返回NULL?或者您无法接收第二台设备的触发事件? -
没错,Win32_PnPSignedDriver 不会更新。对于第二个设备,我仍然获得了第一个设备的插槽。此方法在插入 USB 后立即执行。
-
我使用这个 PowerShell 命令:
Get-CimInstance Win32_PnPSignedDriver | Select-Object DeviceId,Description | where DeviceId -like "USB\VID*" | where description -like "USB Mass Storage Device"。获得新的更新确实需要时间。你能检查一下WM_DEVICECHANGE是否有帮助吗? Related issue. -
是的,加载需要时间,这是我的问题。 WM_DEVICECHANGE API 无助于实现我的目的。我实际上是用它来触发 GetPhysicalPort() 方法。
-
因为
WM_DEVICECHANGE消息在设备插入后立即发布,并且从那里您可以获取驱动器路径,如 E:/F: 映射到的 USB 设备。因此,如果您想读取或写入该存储,则可以比使用Win32_PnPSignedDriver更快地实现。或者你能分享一下你想用插入的 USB 插槽做什么?
标签: windows-10 usb wmi winapi