技术开发 频道

如何检查驱动器和CD-ROM的变化


【IT168技术文档】

  如果你想得到光盘插入光驱或者系统添加了新驱动器的消息,那么检查Windows管理器(Windows Management Instrumentation,WMI)是一种简单的方法。


  接收系统消息一般是一个比较烦杂的过程,不过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就会被调用。

  查询EventArrivedEventArgs对象


  被传递到ChangeCDHandler的EventArrivedEventArgs实例含有一个叫着NewEvent的属性,它返回一个 ManagementBaseObject实例。第一眼看去,你可能会觉得这就是你所需要的东西。你可能会假设你将查询这个对象的 Win32_CDROMDriver属性;然而,由于事件队列结构的关系,我们不能直接这么做,还需要通过一个中间环节绕一下。

  首先,查询“TargetInstance”的NewEvent属性。(这里的“TargetInstance”实际上就是 Win32_CDROMDrive实例。)把返回的对象回溯成ManagementBaseObject之后,你就可以自由的查询 Win32_CDROMDrive对象中的任何属性了。下面的例子获取光驱的盘符:

  string drive = ((ManagementBaseObject)(e.NewEvent["TargetInstance"]))["Drive"].ToString();

  下载这个压缩文件,它包含了例子项目的全部功能,也就是说它即可以检测光驱中光盘的变化,又可以检测驱动器的添加和移除。为了测试后者,你将需要大量的可交换驱动,如USB硬驱动(hard drive)。
0
相关文章