【问题标题】:Detecting Eject/Insert of Removeable Media检测可移动介质的弹出/插入
【发布时间】:2009-11-02 18:11:36
【问题描述】:

我正在进行一个项目,我需要能够检测 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 时它永远不会被击中。因为我根本没有弄乱这个,而且我在网上看到的所有示例都只是引用了相同的源代码(有细微的变化)

【问题讨论】:

    标签: c# wmi


    【解决方案1】:
    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");
    }
    

    【讨论】:

    • 谢谢!那行得通……我对为什么有点困惑。我也试过...DriveType = 5,我看到的唯一其他区别是\` before root\\CIMV2`。 PEBCAK 美贝?我唯一要问的是,你的答案的格式是固定的,所以它是可读的。再次非常感谢!
    猜你喜欢
    • 2011-07-03
    • 2011-10-02
    • 1970-01-01
    • 2011-05-11
    • 2016-06-09
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多