接收系统消息一般是一个比较烦杂的过程,不过WMI却提供了一个简单明了的解决方案。与其检查新硬件,你不如登记到WMI,这样如果系统安装或者改变了你感兴趣的硬件,你就会得到相应的消息。你还可以用WMI来调整系统并检查特定服务或者驱动是否存在以确保它可以正常运转。
当你收到这样的事件通知时,你可以根据应用程序所需而采取合适的动作。例如,假设你有一个程序需要读取光盘中的内容,你可以自动扫描光盘而不必等待用户告诉程序光盘已经插入。
WMI基于一种叫着Web Based Enterprise Management(WBEM)的面向对象数据库,该数据库中填充了系统数据,例如系统安装了哪些硬件和软件。在面相对象的数据库中,我们把表格(table)称为类,把行(raw)称之为类的实例。
WMI在一个类中提供了系统大多数的硬件和软件信息。例如,当系统有光驱时,它就创建了一个Win32_CDROMDrive类的实例。
在WMI中有九种类型的事件,但是一般情况下你只需要使用其中的三种就足够了。我们在本文所举的例子中用到的事件类型是__InstanceCreationEvent、__InstanceDeletionEvent以及__InstanceModificationEvent。其它六种类型的消息是类以及名字空间的添加、移除和修改。
下面C#代码用以设置光驱碟片发生变化的事件队列:
changeCDQuery = new WqlEventQuery(
"__InstanceModificationEvent",
new
TimeSpan(0,0,1),
"TargetInstance isa "Win32_CDROMDrive""
);
上面的代码建立了对任何光驱的任何改动的消息队列。现在,我们将建立一个ManagementEventWatcher实例。
changeCDWatcher = new ManagementEventWatcher(changeCDQuery);
然后,我们给changeCDWatcher对象添加一个事件回调(callback)。
changeCDWatcher.EventArrived += new EventArrivedEventHandler(ChangeCDHandler);
ChangeCDHandler方法有如下申明:
void ChangeCDHandler(object sender, EventArrivedEventArgs e)
现在,只要光驱中的介质发生变化,ChangeCDHandler就会被调用。