【问题标题】:WMI InstanceCreationEvent not fired after windows hibernateWindows 休眠后未触发 WMI InstanceCreationEvent
【发布时间】:2018-04-19 06:49:58
【问题描述】:

我创建了两个处理程序来接收 USB 设备插入/拔出事件,类似于 this answer

private void RegisterUSBEvents()
{
    WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_PnPEntity'");
    ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
    insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
    insertWatcher.Start();
    WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_PnPEntity'");
    ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
    removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
    removeWatcher.Start();
}

我可以使用上面的代码接收任何 USB 插拔事件。

对于大多数 PC,在 Windows 从休眠状态唤醒后,我的应用将收到 InstanceDeletionEvent,然后是 USB 设备的 InstanceCreationEvent

但是,在少数计算机上,Windows 休眠和唤醒后,我只能收到InstanceDeletionEvent,但没有InstanceCreationEvent 用于同一设备。 USB 设备在 USB 端口上保持不变。

如果我关闭并重新启动我的应用程序,或者拔下/插入同一设备,上述代码将再次起作用。

是否有任何问题导致 USB 设备在某些环境下休眠后会触发 InstanceDeletionEvent 但不会触发 InstanceCreationEvent

【问题讨论】:

    标签: c# windows-services usb wmi


    【解决方案1】:

    有一个名为 ResetOnResume 的注册表项将强制 USB 驱动程序堆栈在唤醒时重置设备。默认情况下它是禁用的,这可以解释您在某些 PC 上从休眠状态唤醒后遇到的问题。

    ResetOnResume

    指示当 USB 驱动程序堆栈是否必须重置设备时 端口从睡眠周期中恢复。

    【讨论】:

    • 我检查了一台有问题的电脑。 usb 设备的注册表项不包含ResetOnResume 项。
    • 你按照文章创建。
    【解决方案2】:

    我找到了答案,但似乎与软件无关。

    在那些有问题的 PC 上,如果将 USB 设备插入到 USB 端口直接在主板上InstanceDeletionEventInstanceCreationEvent 在从休眠状态唤醒后会正常启动,超过 95%工作机会。

    如果将 USB 设备插入前面板 USB 端口,则 InstanceCreationEvent 在唤醒后不会触发的可能性约为 75%。

    可能是硬件问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多