获取USB驱动器的驱动器号

时间:2014-11-12 05:40:21

标签: c#

我已按照给定链接How do I detect when a removable disk is inserted using C#?

中的建议检测到我的WPF应用程序中插入了USB驱动器

但是我无法弄清楚检测到的USB驱动器的驱动器号;我的代码如下:

    static ManagementEventWatcher w = null;
    static void AddInsertUSBHandler()
    {

        WqlEventQuery q;
        ManagementScope scope = new ManagementScope("root\\CIMV2");
        scope.Options.EnablePrivileges = true;

        try {

            q = new WqlEventQuery();
            q.EventClassName = "__InstanceCreationEvent";
            q.WithinInterval = new TimeSpan(0, 0, 3);
            q.Condition = "TargetInstance ISA 'Win32_USBControllerdevice'";
            w = new ManagementEventWatcher(scope, q);
            w.EventArrived += USBInserted;

            w.Start();
        }
        catch (Exception e) {

            Console.WriteLine(e.Message);
            if (w != null)
            {
                w.Stop();

            }
        }

    }

    static void USBInserted(object sender, EventArgs e)
    {

        Console.WriteLine("A USB device inserted");

    } 

请尽可能指导我。

2 个答案:

答案 0 :(得分:2)

希望这会有所帮助,它的代码基于Neeraj Dubbey的答案。

我们在连续的多线程循环中运行代码,不断检查连接的USB设备的变化。因为我们跟踪以前连接的设备,我们可以将它与新的设备列表进行比较。我们还可以使用相同的方法确定是否删除了设备。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Usb_Test
{
    class Program
    {
        private static List<USBDeviceInfo> previousDecices = new List<USBDeviceInfo>();

        static void Main(string[] args)
        {
            Thread thread = new Thread(DeviceDetection);
            thread.Start();

            Console.Read();
        }

        static void DeviceDetection()
        {
            while (true)
            {
                List<USBDeviceInfo> devices = new List<USBDeviceInfo>();

                ManagementObjectCollection collection;
                using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
                    collection = searcher.Get();

                foreach (var device in collection)
                {
                    devices.Add(new USBDeviceInfo(
                    (string)device.GetPropertyValue("DeviceID")
                    ));
                }

                if (previousDecices == null || !previousDecices.Any()) // So we don't detect already plugged in devices the first time.
                    previousDecices = devices;

                var insertionDevices = devices.Where(d => !previousDecices.Any(d2 => d2.DeviceID == d.DeviceID));
                if (insertionDevices != null && insertionDevices.Any())
                {
                    foreach(var value in insertionDevices)
                    {
                        Console.WriteLine("Inserted: " + value.DeviceID); // Add your own event for the insertion of devices.
                    }
                }    

                var removedDevices = previousDecices.Where(d => !devices.Any(d2 => d2.DeviceID == d.DeviceID));
                if (removedDevices != null && removedDevices.Any())
                {
                    foreach (var value in removedDevices)
                    {
                        Console.WriteLine("Removed: " + value.DeviceID); // Add your own event for the removal of devices.
                    }
                }

                previousDecices = devices;
                collection.Dispose();
            }
        }
    }

    class USBDeviceInfo
    {
        public USBDeviceInfo(string deviceID)
        {
            this.DeviceID = deviceID;
        }
        public string DeviceID { get; private set; }

    }
}

然而,这不是一个很好的解决方案,你听WM_DEVICECHANGE会好很多。

  

Windows会在任何时候向所有应用程序发送WM_DEVICECHANGE消息   发生一些硬件更改,包括闪存驱动器(或其他)   插入或移除可移动设备。这个的WParam参数   message包含完全指定发生了什么事件的代码。对于   我们的目的只有以下事件很有趣:

     

DBT_DEVICEARRIVAL - 在设备或媒体播放后发送   插入。您的程序将在设备运行时收到此消息   准备好使用,大约在Explorer显示对话框的时候   它允许您选择如何处理插入的媒体。

     

DBT_DEVICEQUERYREMOVE - 在系统请求权限时发送   删除设备或媒体。任何应用程序都可以否认这一点   请求并取消删除。如果你这是重要的事件   需要在闪存驱动器移除之前对闪存驱动器执行某些操作,   例如加密一些文件。您的程序可以拒绝此请求   这将导致Windows显示众所周知的消息   该设备现在无法移除。

     

DBT_DEVICEREMOVECOMPLETE - 在删除设备后发送。什么时候   您的程序收到此事件,该设备不再可用 -   当Windows显示其“设备已被删除”泡沫时   给用户。

以下是一些链接,每个链接都详细说明如何在C#中执行此操作:

http://www.codeproject.com/Articles/18062/Detecting-USB-Drive-Removal-in-a-C-Program http://www.codeproject.com/Articles/60579/A-USB-Library-to-Detect-USB-Devices

两种解决方案都应该有效,您可以随时调整它们以满足您的需求。

答案 1 :(得分:0)

在项目

中添加System.Management的引用后,嘿尝试这个基于控制台的代码
namespace ConsoleApplication1
{
 using System;
 using System.Collections.Generic;
 using System.Management; // need to add System.Management to your project references.

class Program
{
static void Main(string[] args)
{
    var usbDevices = GetUSBDevices();

    foreach (var usbDevice in usbDevices)
    {
        Console.WriteLine("Device ID: {0}", usbDevice.DeviceID);

    }

    Console.Read();
}

static List<USBDeviceInfo> GetUSBDevices()
{
    List<USBDeviceInfo> devices = new List<USBDeviceInfo>();

    ManagementObjectCollection collection;
    using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
        collection = searcher.Get();

    foreach (var device in collection)
    {
        devices.Add(new USBDeviceInfo(
        (string)device.GetPropertyValue("DeviceID")
        ));
    }

    collection.Dispose();
    return devices;
}
}

class USBDeviceInfo
{
public USBDeviceInfo(string deviceID)
{
    this.DeviceID = deviceID;
}
public string DeviceID { get; private set; }

}