Detecting USB drive insertion and removal using windows service and c# Detecting USB drive insertion and removal using windows service and c# windows windows

Detecting USB drive insertion and removal using windows service and c#


You can use WMI, it is easy and it works a lot better than WndProc solution with services.

Here is a simple example:

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();


This works well for me, plus you can find out more information about the device.

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);}


Adding to VitalyB's post.

To raise an event where ANY USB device is inserted, use the following:

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();

This will raise an event whenever a USB device is plugged. It even works with a National Instruments DAQ that I'm trying to auto-detect.