代码之家  ›  专栏  ›  技术社区  ›  Nathan Wheeler

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

  •  4
  • Nathan Wheeler  · 技术社区  · 15 年前

    我正在做一个项目,在这个项目中,我需要能够检测何时插入或移除CD或USB驱动器。我找到了一些源代码,本来应该可以做到这一点,但是,当我插入或弹出一张CD时,似乎什么都没有发生。

    有人能验证一下来源是正确的吗?能给我一些关于我在这里可能做错了什么的线索吗?

    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时,它永远不会被击中。因为我一点也没有搞砸,我在网上看到的所有例子都简单地引用了相同的源代码(有细微的变化)。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Robert Harvey    6 年前
    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");
    }