приведенный ниже код работает для меня.он подписывается на события DriveType = 2 и DriveType = 5 для обнаружения CD-ROM и USB.Поскольку мне не нужно знать, был ли диск смонтирован или размонтирован, или CD был удален или вставлен, код не проверяет это.для подключений usb e.NewEvent.ClassPath может использоваться для определения того, был ли диск подключен или отключен.
Кроме того, в Интернете я нашел несколько запутанных замечаний о том, что подписка на события только для DriveType = 5 будет обнаруживать подключения USBтакже.у меня это не сработало.
константин
using System;
using System.Management;
namespace consapp
{
class Program
{
static void Main(string[] args)
{
const string QUERY = @"select * from __InstanceOperationEvent within 1 where TargetInstance isa 'Win32_LogicalDisk' and (TargetInstance.DriveType=2 or TargetInstance.DriveType=5)";
Program p = new Program();
ManagementEventWatcher w = new ManagementEventWatcher(new WqlEventQuery(QUERY));
w.EventArrived += new EventArrivedEventHandler(p.OnWMIEvent);
w.Start();
Console.ReadKey();
w.Stop();
}
public void OnWMIEvent(object sender, EventArrivedEventArgs e)
{
PropertyData p = e.NewEvent.Properties["TargetInstance"];
if (p != null)
{
ManagementBaseObject mbo = p.Value as ManagementBaseObject;
PropertyData deviceid = mbo.Properties["DeviceID"];
PropertyData drivetype = mbo.Properties["DriveType"];
Console.WriteLine("{0}-{1}:{2}", deviceid.Value, drivetype.Value, e.NewEvent.ClassPath);
}
}
}
}