检测可移动介质的弹出/插入

我正在开发一个项目,我需要能够检测何时插入或移除CD或USB驱动器。 我找到了一些应该做这件事的源代码,但是,当我插入或弹出CD时似乎没有任何事情发生。

有人可以validation来源是否正确,并给我任何关于我在这里做错了什么的指示?

public class MyWindow { ManagementEventWatcher w; private void MyWindow_Loaded(object sender, RoutedEventArgs e) { WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), @"TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.DriveType = 2"); ConnectionOptions opt = new ConnectionOptions(); opt.EnablePrivileges = true; ManagementScope ms = new ManagementScope("root\\CIMV2", opt); w = new ManagementEventWatcher(ms, query); w.EventArrived += new EventArrivedEventHandler(w_EventArrived); w.Start(); } private void w_EventArrived(object sender, EventArrivedEventArgs e) { PropertyData pd = e.NewEvent.Properties["TargetInstance"]; } } 

当我在“PropertyData pd = …”行上设置断点时,弹出/插入CD时它永远不会被击中。 因为我根本没有弄乱这个,所以我在网上看到的所有例子都引用了相同的源代码(略有变化)

 using System.Management; public void networkDevice() { try { WqlEventQuery q = new WqlEventQuery(); q.EventClassName = "__InstanceModificationEvent"; q.WithinInterval = new TimeSpan(0, 0, 1); q.Condition = @"TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.DriveType = 5"; ConnectionOptions opt = new ConnectionOptions(); opt.EnablePrivileges = true; opt.Authority = null; opt.Authentication = AuthenticationLevel.Default; //opt.Username = "Administrator"; //opt.Password = ""; ManagementScope scope = new ManagementScope("\\root\\CIMV2", opt); ManagementEventWatcher watcher = new ManagementEventWatcher(scope, q); watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); watcher.Start(); } catch (ManagementException e) { Console.WriteLine(e.Message); } } void watcher_EventArrived(object sender, EventArrivedEventArgs e) { ManagementBaseObject wmiDevice = (ManagementBaseObject)e.NewEvent["TargetInstance"]; string driveName = (string)wmiDevice["DeviceID"]; Console.WriteLine(driveName); Console.WriteLine(wmiDevice.Properties["VolumeName"].Value); Console.WriteLine((string)wmiDevice["Name"]); if (wmiDevice.Properties["VolumeName"].Value != null) Console.WriteLine("CD has been inserted"); else Console.WriteLine("CD has been ejected"); }