我正在使用WMI查找插入USB设备的事件。我创建了一个独立的类来试试这个,它运行得很好!一旦我从我的应用程序调用该类,它就不起作用。代码是相同的,当我将类编译为独立的exe时,main()除外。代码如下:
ManagementScope scope = new ManagementScope("root\\CIMV2"); //set the scope
WqlEventQuery query = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_PnPEntity'"); //set the events
watcher = new ManagementEventWatcher(scope, query);
watcher.EventArrived += new EventArrivedEventHandler(this.DeviceChangeEventReceived);
watcher.Start();
在内置到较大的应用程序中时,永远不会调用DeviceChangeEventReceived方法。我认为它可能是范围,但似乎不是。我确信这很简单,但我没有想法。谢谢!
答案 0 :(得分:1)
我已经确定在独立类和调用该类的应用程序之间需要修改WMI查询。需要有一个TIMESPAN。我发现这只是愚蠢的运气,我给处理程序一个10秒的时间,它工作!
"SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_PnPEntity'"
似乎WQLEventQuery方法只是轮询是否未指定时间跨度,并且在这种情况下,它会导致事情变得令人讨厌。如果它抛出异常会很好,但有些东西可能会被埋没在InterloperServices中。