Хотя уже приведенные ответы обеспечивают хорошую отправную точку, я хотел бы добавить несколько рабочих примеров для .net 4.5, а также пример захвата USB-устройства типа .
В ответе Треба он использовал 'Win32_USBControllerDevice'
. Это может или не может быть лучшим условием для вашего запроса, в зависимости от того, что вы хотите выполнить. Идентификатор устройства из Win32_USBControllerDevice уникален для каждого устройства. Так что, если вы ищете уникальный идентификатор, который идентифицирует одно устройство, то это именно то, что вы хотите. Но если вы ищете устройство типа , вы можете использовать 'Win32_PnPEntity'
и получить доступ к свойству Description
. Вот пример получения определенного типа устройства по его описанию:
using System;
using System.ComponentModel.Composition;
using System.Management;
public class UsbDeviceMonitor
{
private ManagementEventWatcher plugInWatcher;
private ManagementEventWatcher unPlugWatcher;
private const string MyDeviceDescription = @"My Device Description";
~UsbDeviceMonitor()
{
Dispose();
}
public void Dispose()
{
if (plugInWatcher != null)
try
{
plugInWatcher.Dispose();
plugInWatcher = null;
}
catch (Exception) { }
if (unPlugWatcher == null) return;
try
{
unPlugWatcher.Dispose();
unPlugWatcher = null;
}
catch (Exception) { }
}
public void Start()
{
const string plugInSql = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PnPEntity'";
const string unpluggedSql = "SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PnPEntity'";
var scope = new ManagementScope("root\\CIMV2") {Options = {EnablePrivileges = true}};
var pluggedInQuery = new WqlEventQuery(plugInSql);
plugInWatcher = new ManagementEventWatcher(scope, pluggedInQuery);
plugInWatcher.EventArrived += HandlePluggedInEvent;
plugInWatcher.Start();
var unPluggedQuery = new WqlEventQuery(unpluggedSql);
unPlugWatcher = new ManagementEventWatcher(scope, unPluggedQuery);
unPlugWatcher.EventArrived += HandleUnPluggedEvent;
unPlugWatcher.Start();
}
private void HandleUnPluggedEvent(object sender, EventArrivedEventArgs e)
{
var description = GetDeviceDescription(e.NewEvent);
if (description.Equals(MyDeviceDescription))
// Take actions here when the device is unplugged
}
private void HandlePluggedInEvent(object sender, EventArrivedEventArgs e)
{
var description = GetDeviceDescription(e.NewEvent);
if (description.Equals(MyDeviceDescription))
// Take actions here when the device is plugged in
}
private static string GetDeviceDescription(ManagementBaseObject newEvent)
{
var targetInstanceData = newEvent.Properties["TargetInstance"];
var targetInstanceObject = (ManagementBaseObject) targetInstanceData.Value;
if (targetInstanceObject == null) return "";
var description = targetInstanceObject.Properties["Description"].Value.ToString();
return description;
}
}
Некоторые ссылки, которые могут быть полезны для исследования того, какие классы использовать в ваших операторах sql:
Классы Win32 - В приведенном выше примере использовался класс 'Win32_PnPEntity'
.
Системные классы WMI - В приведенном выше примере использовались классы __InstanceCreationEvent
и __InstanceDeletionEvent
.