He estado escribiendo un código que detecta añadir y eliminación de dispositivos USB, y he utilizado el siguiente código de WMI para registrar las notificaciones de cambio de dispositivo:El uso de WMI para identificar qué dispositivo causó una Win32_DeviceChangeEvent
watcher = new ManagementEventWatcher(query);
watcher.EventArrived += new EventArrivedEventHandler(DeviceChangeEventReceived);
watcher.Start();
este es el código del controlador:
void DeviceChangeEventReceived(object sender, EventArrivedEventArgs e)
{
foreach (PropertyData pd in e.NewEvent.Properties)
{
Log.Debug("\t" + pd.Name + ":" + pd.Value + "\t" + pd.Value.GetType());
}
}
esto es grande y todo, funciona para cualquier dispositivo USB enchufo o eliminar del sistema. El problema que estoy teniendo es, ¿cómo identifico el dispositivo específicamente que causó los eventos?
En otra parte de mi programa, guardo una lista de los dispositivos actualmente conectados que más me interesan, así que si aparece un evento eliminado por el dispositivo, puedo verificar esa lista en WMI usando "select * from Win32_PnPEntity "o alguna otra consulta similar. PERO, esta es una forma muy incorrecta e incómoda de identificar el dispositivo que se eliminó. El problema adicional es que no tengo forma de decir con precisión qué dispositivo se agregó, a menos que almacene en caché toda la lista de Win32_PnPEntity antes de tiempo, y realice comparaciones/validaciones realmente alocadas.
¿Me falta algo obvio aquí? ¿Cómo asocio los eventos de cambio de dispositivo a un dispositivo específico?
ACTUALIZACIÓN: Todavía no he encontrado una solución ideal para este problema, pero lo que estoy haciendo es mantener una lista de los dispositivos actualmente conectados (que me interesan) en la memoria, y cada vez que un evento se maneja (ver arriba), consulto el Win32_PnPEntity para ver si los dispositivos que he almacenado en mi lista de dispositivos conectados todavía están conectados. Esta es una solución subóptima, porque parece extraño que no pueda obtener ninguna información específica de identificación del dispositivo del evento que indique "evento de cambio del dispositivo". Parece MUY extraño, que esta información no está disponible. suspiro
Esta buena respuesta sí funciona, pero desafortunadamente es una desventaja. Los usuarios deben saber que esta es una consulta ** _ polling _ ** (la sugerencia es "dentro de 2", y "dentro" no es una opción l para esta consulta). Requiere que la CPU haga sondeos constantemente, y esto se puede ver como una carga significativa de la CPU (en mi prueba, aproximadamente ~ 5% en un sistema de cuatro núcleos, realmente alrededor del 20% de un solo núcleo, con dos consultas usando "dentro de 1 ") en el servicio WmiPrvSE.exe. Estos eventos también se producen, como es lógico, unos 1-2 segundos después del Win32_DeviceChangeEvent correspondiente, por lo que hay un retraso significativo en la generación de informes. – dale