2011-11-18 11 views
8

Cómo detectar un evento cuando se agrega una nueva unidad a Mi PC y preferiblemente y cuando se crea un nuevo punto de montaje para una unidad en una unidad NTFS?Detectar evento de montaje de unidad en C#


I figued a cabo esto, pero no funciona en las carpetas montadas:

_eventWatcher = new ManagementEventWatcher("SELECT * FROM Win32_VolumeChangeEvent"); 

_eventWatcher.EventArrived += (o, args) => 
    {switch(args.NewEvent["EventType"].ToString()[0]) 
     { 
      case '2': 
       //mount 
       Debug.WriteLine(args.NewEvent["DriveName"]); 
       break; 
      case '3': 
       //unmount 
       break; 
     } 
    }; 

_eventWatcher.Start(); 

alguna idea?

+0

duplicado Posible de: http://stackoverflow.com/questions/4019065/monitoring-drives- with-wmi – aleroot

+1

Con la API de Windows debe procesar el mensaje WM_DEVICECHANGE. Sin embargo, no sé cómo manejarlo en C#. –

+0

¿Hay algo como esto solo para las carpetas montadas en las unidades NTFS? – user629926

Respuesta

7

Si usted tiene una forma, puede anular su método WndProc para capturar mensajes WM_DEVICECHANGE como se ha mencionado Eugene:

private const int WM_DEVICECHANGE = 0x219; 

protected override void WndProc(ref Message m) 
{ 
    base.WndProc(m); 

    if (m.Msg == WM_DEVICECHANGE) 
    { 
     // Check m.wParam to see exactly what happened 
    } 
} 
+0

Probablemente necesite portar mi código al servicio de Windows un tiempo después para que esta solución no funcione. Gracias de cualquier manera. – user629926

+0

si desea hacerlo en un servicio de Windows, debe marcar este: http://www.codeproject.com/KB/system/Windows_Services.aspx?msg=2900262 –