Odpowiedź VitalyB nie obejmuje usunięcia urządzenia. Zmieniłem go trochę, aby wywołać zdarzenie, zarówno gdy nośniki wstawiono i usunięty, a także kod, aby uzyskać literę napędu włożonego nośnika.
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();
}
}
}
Dobre pytanie na służbie zatrzymującą to wydarzenie. Najpierw myślę, że musisz oznaczyć swoją usługę jako "pozwól na interakcję z komputerem", a następnie utwórz ukryte okno. Bezpieczniejszą opcją jest prawdopodobnie stworzenie aplikacji Windows, która działa przy starcie - może stworzyć okno, a następnie komunikować się z svc –
Powiązane: http: // stackoverflow.com/questions/6003822/how-to-detect-a-usb-drive-has-was-plugged – DuckMaestro