event-handling - eventos - dispatchevent jquery
WMI y Win32_DeviceChangeEvent-¿Se devolvió el tipo de evento incorrecto? (4)
Oh! Sí, he pasado por eso, pero usando las llamadas sin procesar de la API de Windows hace algún tiempo, mientras desarrollaba un control ActiveX que detectaba la inserción de cualquier tipo de medio. Intentaré descubrir el código de mis copias de seguridad y veré si puedo decirte cómo lo resolví. Me suscribiré al RSS por si acaso alguien llega primero.
Estoy intentando registrarme en un evento "Dispositivo agregado / Dispositivo eliminado" usando WMI. Cuando digo dispositivo, me refiero a algo en las líneas de un Disk-On-Key o cualquier otro dispositivo que tenga archivos a los que pueda acceder ...
Me estoy registrando en el evento y el evento se plantea, pero la propiedad EventType es diferente de la que espero ver.
La documentación ( MSDN ) indica: 1- cambio de configuración, 2- Dispositivo agregado, 3-Dispositivo eliminado 4- Docking. Por alguna razón siempre obtengo un valor de 1.
Algunas ideas ?
Aquí hay un código de muestra:
public class WMIReceiveEvent
{
public WMIReceiveEvent()
{
try
{
WqlEventQuery query = new WqlEventQuery(
"SELECT * FROM Win32_DeviceChangeEvent");
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
Console.WriteLine("Waiting for an event...");
watcher.EventArrived +=
new EventArrivedEventHandler(
HandleEvent);
// Start listening for events
watcher.Start();
// Do something while waiting for events
System.Threading.Thread.Sleep(10000);
// Stop listening for events
watcher.Stop();
return;
}
catch(ManagementException err)
{
MessageBox.Show("An error occurred while trying to receive an event: " + err.Message);
}
}
private void HandleEvent(object sender,
EventArrivedEventArgs e)
{
Console.WriteLine(e.NewEvent.GetPropertyValue["EventType"]);
}
public static void Main()
{
WMIReceiveEvent receiveEvent = new WMIReceiveEvent();
return;
}
}
Bueno, no pude encontrar el código. Intenté mi antigua cuenta de RAC, nada. Nada en mis viejos respaldos. Imagínate. Pero intenté averiguar cómo lo hice, y creo que esta es la secuencia correcta (basé mucho en este artículo ):
- Obtenga todas las letras de unidad y almacénelas en caché.
- Espere el mensaje WM_DEVICECHANGE e inicie un temporizador con un tiempo de espera de 1 segundo (esto se hace para evitar una gran cantidad de falsos mensajes WM_DEVICECHANGE que comienzan como inicios tan pronto como inserta la llave USB / otro dispositivo y solo finalizan cuando la unidad está "colocado").
- Compare las letras de unidad con la vieja memoria caché y detecte las nuevas.
- Obtenga información del dispositivo para esos.
Sé que hay otros métodos, pero resultó ser el único que funcionaría consistentemente en diferentes versiones de Windows, y lo necesitábamos porque mi cliente usaba el control ActiveX en una página web que cargaba imágenes de cualquier tipo de dispositivo que insertabas ( Creo que produjeron algún tipo de quiosco de impresión).
Bien,
Puedes probar win32_logical disk class y vincularlo al __Instancecreationevent. Puede obtener fácilmente la información requerida
Intenté esto en mi sistema y finalmente obtuve el código correcto. Solo lleva un tiempo. Recibo una docena de eventos y uno de ellos es el código de conexión del dispositivo.