首先ManagementEventWatcher繼承與Component類,因此也繼承IDisposable,注意使用後資源銷毀。ManagementEventWatcher.Query屬性是一個EventQuery對象,用來代表監控的WQL事件查詢語句。
對於同步事件查詢(調用線程會阻塞),使用WaitForNextEvent方法。無參數,返回一個ManagementBaseObject。對於非同步事件查詢(調用線程不會阻塞),使用Start方法。然後使用ManagementEventWatcher的EventArrived事件。這個事件的EventArgs(EventArrivedEventArgs類型)中的NewEvent屬性是一部返回的ManagementBaseObject對象。
要注意的是不管是同步還是非同步得到的ManagementBaseObject都不是WMI事件查詢的目標對象執行個體。而真正執行個體包含在這個ManagementBaseObject的TargetInstance屬性中,這個屬性的值是另一個ManagementBaseObject,而這個ManagementBaseObject才是我們需要的事件查詢中對應的類執行個體,如果你用如下代碼來列舉ManagementBaseObject的PropertyData的話:
//注意:引用System.Management.dll 和 using System.Management;
static void GetProperties(ManagementBaseObject mobj)
{
foreach (PropertyData pro in mobj.Properties)
Console.WriteLine("名稱:{0} 類型:{1} 值:{2}", pro.Name, pro.Type, pro.Value);
}
輸出將會類似這樣:
名稱:SECURITY_DESCRIPTOR 類型:UInt8 值:
名稱:TargetInstance 類型:Object 值:System.Management.ManagementBaseObject
名稱:TIME_CREATED 類型:UInt64 值:129681300945559581
(第二個名稱為TargetInstance的屬性才是真正的類執行個體)
好了理論上就是這些,如果你想看一個執行上的實際程式,可以參考這篇文章:.NET(C#)使用WMI事件查詢實現對進程和可移動磁碟的監控。
最後關於查詢上的時間限制。可以使用ManagementEventWatcher.Options屬性。他的類型是EventWatcherOptions,這個類繼承與ManagementOptions類型,後者有一個Timeout屬性(TimeSpan類型)來控制限時。
如下代碼:
//注意:引用System.Management.dll 和 using System.Management;
var query = new WqlEventQuery(
"__InstanceCreationEvent",
TimeSpan.FromSeconds(3),
"TargetInstance ISA 'Win32_Process'");
using (var watcher = new ManagementEventWatcher(query))
{
watcher.Options.Timeout = TimeSpan.FromSeconds(20);
//限時20秒,逾時後ManagementException異常拋出
ManagementBaseObject e = watcher.WaitForNextEvent();
}