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

Nat*_*ler 4 c# wmi

我正在开发一个项目,我需要能够检测何时插入或移除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"];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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");
}
Run Code Online (Sandbox Code Playgroud)