You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows休眠后WMI __InstanceCreationEvent事件未触发问题咨询

解决Windows休眠后__InstanceCreationEvent无法触发的问题

这个问题我之前也碰到过,核心原因是系统休眠/唤醒时,WMI的临时事件订阅会被重置,ManagementEventWatcher的监听线程也无法自动恢复工作。下面是几个经过验证的解决思路和代码实现:

1. 监听系统电源事件,唤醒后重新注册USB监听

最直接有效的方法是监听系统的休眠/唤醒事件,当检测到系统从休眠状态恢复时,重新初始化WMI事件监听器。这样可以确保订阅在唤醒后被重新建立。

代码修改示例:

首先把ManagementEventWatcher实例改为类的成员变量,方便后续停止和重新初始化:

// 类级别的成员变量,保存监听实例
private ManagementEventWatcher _usbInsertWatcher;
private ManagementEventWatcher _usbRemoveWatcher;

private void RegisterUSBEvents()
{
    // 先停止并释放之前的监听实例(如果存在),避免重复订阅和内存泄漏
    _usbInsertWatcher?.Stop();
    _usbInsertWatcher?.Dispose();
    _usbRemoveWatcher?.Stop();
    _usbRemoveWatcher?.Dispose();

    // 注册USB插入事件
    WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_PnPEntity'");
    _usbInsertWatcher = new ManagementEventWatcher(insertQuery);
    _usbInsertWatcher.EventArrived += DeviceInsertedEvent;
    _usbInsertWatcher.Start();

    // 注册USB移除事件(补全你之前的代码)
    WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_PnPEntity'");
    _usbRemoveWatcher = new ManagementEventWatcher(removeQuery);
    _usbRemoveWatcher.EventArrived += DeviceRemovedEvent;
    _usbRemoveWatcher.Start();
}

// 在应用启动时注册系统电源事件监听
private void InitializePowerEventListeners()
{
    SystemEvents.PowerModeChanged += OnSystemPowerModeChanged;
}

// 处理系统电源状态变化
private void OnSystemPowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
    // 当系统从休眠/睡眠状态恢复时,重新注册USB事件
    if (e.Mode == PowerModes.Resume)
    {
        RegisterUSBEvents();
    }
}

// 记得在应用退出时清理资源,避免内存泄漏
protected override void OnFormClosing(FormClosingEventArgs e)
{
    // 移除电源事件订阅
    SystemEvents.PowerModeChanged -= OnSystemPowerModeChanged;
    
    // 停止并释放WMI监听实例
    _usbInsertWatcher?.Stop();
    _usbInsertWatcher?.Dispose();
    _usbRemoveWatcher?.Stop();
    _usbRemoveWatcher?.Dispose();
    
    base.OnFormClosing(e);
}

2. 额外注意事项

  • 避免重复订阅:每次重新注册前一定要停止并释放旧的ManagementEventWatcher实例,否则会导致多个监听器同时工作,触发重复事件。
  • WMI查询优化:WITHIN 2表示WMI每2秒轮询一次设备状态,你可以根据需求调整这个值——过小会增加系统开销,过大则会导致事件触发延迟。
  • 权限问题:如果是Windows服务或需要管理员权限的应用,确保程序以足够的权限运行,否则WMI事件可能无法正常订阅。

内容的提问来源于stack exchange,提问作者Dia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:55:05