【问题标题】:How to take Usb slot in the hub immediately after plugging it in?插入后如何立即将集线器中的USB插槽插入?
【发布时间】: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


【解决方案1】:

根据WMI Win32_PnPSignedDriver 类,应用程序将花费大量时间来查询或为第二次插入的 USB 提供结果。这取决于应用程序之间的应用程序,因为运行此 WMI 查询的应用程序的极速或响应率将被设计为在 1-2 分钟内给出结果。

我们可以在操作系统级别或 WMI 级别方面进行检查,以查看整个 WMI 是否需要时间在机器上提供查询结果。

  1. 打开运行命令并输入 WBEMTEST。
  2. 单击连接,因为它将连接 CIMV2 命名空间。在这个命名空间下是 Win32_PnPSignedDriver 类
  3. 当我们使用查询 select * from win32_PnPSignedDriver 查询此类时,它会立即向我们显示一些结果,例如 60-70。
  4. 现在,当您关闭它并再次运行相同的查询时,它会显示更多或相同的结果,具体取决于操作系统等。

以上将向我们展示 WMI 查询或 WMI 作为一个整体在机器上以应有的方式工作。

此问题可能是由于应用程序根据其正在查询的 WMI 查询花费大量时间来读取第二个 USB 的内容。

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 2018-11-05
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多