代码之家  ›  专栏  ›  技术社区  ›  Kb.

使用windows服务和c检测USB驱动器的插入和删除#

  •  53
  • Kb.  · 技术社区  · 17 年前

    研究开发USB分布式应用程序的可能性

    将使用.Net和C。
    寻找如何使用C#实现此目的的建议?



    -覆盖WndProc

    -在ManagementEventWatcher中使用WMI查询
    8 回复  |  直到 12 年前
        1
  •  72
  •   VitalyB    7 年前

    您可以使用WMI,它很简单,而且比WndProc解决方案和服务的效果要好得多。

    下面是一个简单的例子:

    using System.Management;
    
    ManagementEventWatcher watcher = new ManagementEventWatcher();
    WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2");
    watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
    watcher.Query = query;
    watcher.Start();
    watcher.WaitForNextEvent();
    
        2
  •  52
  •   helder.tavares.silva    9 年前

    这对我来说很好,而且你可以找到更多关于这个设备的信息。

    using System.Management;
    
    private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
    {
        ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
        foreach (var property in instance.Properties)
        {
            Console.WriteLine(property.Name + " = " + property.Value);
        }
    }
    
    private void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
    {
        ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
        foreach (var property in instance.Properties)
        {
            Console.WriteLine(property.Name + " = " + property.Value);
        }
    }            
    
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
    
        ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
        insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
        insertWatcher.Start();
    
        WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
        ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
        removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
        removeWatcher.Start();
    
        // Do something while waiting for events
        System.Threading.Thread.Sleep(20000000);
    }
    
        3
  •  22
  •   Lee Taylor Dejan.S    13 年前

    增加了VitalyB的职位。

    任何 插入USB设备后,请使用以下命令:

    var watcher = new ManagementEventWatcher();
    var query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
    watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
    watcher.Query = query;
    watcher.Start();
    

    这将在USB设备插入时引发事件。它甚至可以与我正在尝试自动检测的国家仪器DAQ一起工作。

        4
  •  17
  •   Fidel    8 年前

    插入 远离的

    using System;
    using System.Management;
    
    namespace MonitorDrives
    {
        class Program
        {
            public enum EventType
            {
                Inserted = 2,
                Removed = 3
            }
    
            static void Main(string[] args)
            {
                ManagementEventWatcher watcher = new ManagementEventWatcher();
                WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 or EventType = 3");
    
                watcher.EventArrived += (s, e) =>
                {
                    string driveName = e.NewEvent.Properties["DriveName"].Value.ToString();
                    EventType eventType = (EventType)(Convert.ToInt16(e.NewEvent.Properties["EventType"].Value));
    
                    string eventName = Enum.GetName(typeof(EventType), eventType);
    
                    Console.WriteLine("{0}: {1} {2}", DateTime.Now, driveName, eventName);
                };
    
                watcher.Query = query;
                watcher.Start();
    
                Console.ReadKey();
            }
        }
    }
    
        5
  •  6
  •   lzutao    9 年前

    对以上答案稍加修改:

    using System.Management;
    
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
    
            bgwDriveDetector.DoWork += bgwDriveDetector_DoWork;
            bgwDriveDetector.RunWorkerAsync();
        }
    
        private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
        {
            string driveName = e.NewEvent.Properties["DriveName"].Value.ToString();
            MessageBox.Show(driveName + " inserted");
        }
    
        private void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
        {
            string driveName = e.NewEvent.Properties["DriveName"].Value.ToString();
            MessageBox.Show(driveName + " removed");
        }
    
        void bgwDriveDetector_DoWork(object sender, DoWorkEventArgs e)
        {
            var insertQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
            var insertWatcher = new ManagementEventWatcher(insertQuery);
            insertWatcher.EventArrived += DeviceInsertedEvent;
            insertWatcher.Start();
    
            var removeQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3");
            var removeWatcher = new ManagementEventWatcher(removeQuery);
            removeWatcher.EventArrived += DeviceRemovedEvent;
            removeWatcher.Start();
        }
    }
    
        6
  •  5
  •   John Conrad    17 年前

    你也可以使用 WMI

        7
  •  4
  •   Mike Marshall    17 年前
        8
  •  4
  •   dtwk2    6 年前

    我的完整答案可以找到 here 作为要点

    How to get the drive letter of USB device using WMI

    我修改了Phil Minor的代码,使其具有反应性:

       public class UsbDetector : IUsbDetector
        {
            private const string Query = "SELECT * FROM {0} WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'";
            private const string CreationEvent = "__InstanceCreationEvent";
            private const string DeletionEvent = "__InstanceDeletionEvent";
            private const int ReplayNumber = 1;
    
            private readonly Subject<USBDeviceInfo> adds = new Subject<USBDeviceInfo>();
            private readonly Subject<USBDeviceInfo> removes = new Subject<USBDeviceInfo>();
    
            public UsbDetector()
            {
                var bgwDriveDetector = new BackgroundWorker();
                bgwDriveDetector.DoWork += DoWork;
                bgwDriveDetector.RunWorkerAsync();
            }
    
            public IObservable<USBDeviceInfo> Adds => adds.AsObservable();
    
            public IObservable<USBDeviceInfo> Removes => removes.AsObservable();
    
    
            private void DoWork(object sender, DoWorkEventArgs e)
            {
                SubscribeToEvent(CreationEvent, adds);
                SubscribeToEvent(DeletionEvent, removes);
            }
    
            private static void SubscribeToEvent(string eventType, IObserver<USBDeviceInfo> observer)
            {
                WqlEventQuery wqlEventQuery = new WqlEventQuery(string.Format(Query, eventType));
                ManagementEventWatcher insertWatcher = new ManagementEventWatcher(wqlEventQuery);
    
                var observable = Observable.FromEventPattern<EventArrivedEventHandler, EventArrivedEventArgs>(
                    h => insertWatcher.EventArrived += h,
                    h => insertWatcher.EventArrived -= h).Replay(ReplayNumber);
    
                observable.Connect();
                observable.Select(a => a.EventArgs).Select(MapEventArgs).Subscribe(observer);
                insertWatcher.Start();
            }
    
    
            private static USBDeviceInfo MapEventArgs(EventArrivedEventArgs e)
            {
                ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
    
                string deviceId = (string)instance.GetPropertyValue("DeviceID");
                string serialNr = deviceId.Substring(deviceId.LastIndexOf('\\')).Replace("\\", "");
                char driveLetter = GetDriveLetter(serialNr).First();
    
                return new USBDeviceInfo(deviceId, serialNr, driveLetter);
            }
    
        9
  •  3
  •   Lance Cleveland    15 年前

        using System.Windows.Interop;
    ...
    public partial class MainWindow : Window
     {
        ...
        public MainWindow()
        {
        ...
        }
    
        //============================================================
        // WINDOWS MESSAGE HANDLERS
        // 
    
        private const int WM_DEVICECHANGE = 0x0219;  // int = 537
        private const int DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 0x00000004; 
    
        /// <summary>
        ///
        /// </summary>
        /// <param name="e"></param>
        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
            source.AddHook(WndProc);
        }
    
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == WM_DEVICECHANGE)
            {
                ReadDongleHeader();
            }
            return IntPtr.Zero;
        }
    
    }
    
        10
  •  2
  •   Milind Morey    7 年前
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Management;
    using System.ComponentModel;
    
    namespace ConsoleApplication4
    {
      public  class usbState
        {
           public usbState()
            {
    
            }
    
       private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
       {
           ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
           foreach (var property in instance.Properties)
           {
               Console.WriteLine(property.Name + " = " + property.Value);
           }
       }
    
       private void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
       {
           ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
           foreach (var property in instance.Properties)
           {
               Console.WriteLine(property.Name + " = " + property.Value);
           }
       } 
    
        public  void bgwDriveDetector_DoWork(object sender, DoWorkEventArgs e)
        {
            WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
    
            ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
            insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
            insertWatcher.Start();
    
            WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
            ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
            removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
            removeWatcher.Start();
        }
    
    }
    
    
    
    class Class1
    {
           private static void Main(string[] args)
          {
              usbState  usb= new usbState();
    
    
    
              BackgroundWorker bgwDriveDetector = new BackgroundWorker();
              bgwDriveDetector.DoWork += usb.bgwDriveDetector_DoWork;
              bgwDriveDetector.RunWorkerAsync();
              bgwDriveDetector.WorkerReportsProgress = true;
              bgwDriveDetector.WorkerSupportsCancellation = true;
    
             // System.Threading.Thread.Sleep(100000);
               Console.ReadKey();
    
           }
    
    
    
    
    
    }
    
    }
    
    推荐文章