2008-11-07 6 views
16

Solo me preocupa Windows, así que no hay necesidad de entrar en esoterica sobre la compatibilidad Mono o algo así.¿Cómo puedo detectar cuándo se inserta un disco extraíble usando C#?

Debo agregar que la aplicación que estoy escribiendo es WPF, y preferiría evitar tener una dependencia en System.Windows.Forms si es posible.

+0

¿Estamos hablando de un puerto USB ¿Puerto? –

+0

Una unidad USB sería un ejemplo de disco extraíble, pero Windows generalmente las trata igual que las unidades ópticas y similares cuando se trata de eventos. –

Respuesta

16

dar a este un tiro ...

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Management; 

namespace WMITestConsolApplication 
{ 

    class Program 
    { 

     static void Main(string[] args) 
     { 

      AddInsertUSBHandler(); 
      AddRemoveUSBHandler(); 
      while (true) { 
      } 

     } 

     static ManagementEventWatcher w = null; 

     static void AddRemoveUSBHandler() 
     { 

      WqlEventQuery q; 
      ManagementScope scope = new ManagementScope("root\\CIMV2"); 
      scope.Options.EnablePrivileges = true; 

      try { 

       q = new WqlEventQuery(); 
       q.EventClassName = "__InstanceDeletionEvent"; 
       q.WithinInterval = new TimeSpan(0, 0, 3); 
       q.Condition = "TargetInstance ISA 'Win32_USBControllerdevice'"; 
       w = new ManagementEventWatcher(scope, q); 
       w.EventArrived += USBRemoved; 

       w.Start(); 
      } 
      catch (Exception e) { 


       Console.WriteLine(e.Message); 
       if (w != null) 
       { 
        w.Stop(); 

       } 
      } 

     } 

     static void AddInsertUSBHandler() 
     { 

      WqlEventQuery q; 
      ManagementScope scope = new ManagementScope("root\\CIMV2"); 
      scope.Options.EnablePrivileges = true; 

      try { 

       q = new WqlEventQuery(); 
       q.EventClassName = "__InstanceCreationEvent"; 
       q.WithinInterval = new TimeSpan(0, 0, 3); 
       q.Condition = "TargetInstance ISA 'Win32_USBControllerdevice'"; 
       w = new ManagementEventWatcher(scope, q); 
       w.EventArrived += USBInserted; 

       w.Start(); 
      } 
      catch (Exception e) { 

       Console.WriteLine(e.Message); 
       if (w != null) 
       { 
        w.Stop(); 

       } 
      } 

     } 

     static void USBInserted(object sender, EventArgs e) 
     { 

      Console.WriteLine("A USB device inserted"); 

     } 

     static void USBRemoved(object sender, EventArgs e) 
     { 

      Console.WriteLine("A USB device removed"); 

     } 
    } 

} 
+0

¿En qué ensamblaje está el ManagementEventWatcher? –

+0

System.Management, de acuerdo con este artículo de MSDN: http://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.aspx – ine

+1

Parece que está en System.Management.dll - http: // msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.aspx –

1

La forma más sencilla sería la de crear un controlador de reproducción automática:

http://www.codeproject.com/KB/system/AutoplayDemo.aspx

reproducción automática Versión 2 es una característica de Windows XP que escaneará los primeros cuatro niveles de un medio extraíble, cuando llega, buscando contenido multimedia tipos (música, gráficos o video). El registro de las aplicaciones se realiza por tipo de contenido. Cuando llega un medio extraíble , Windows XP determina qué acciones realizar por evaluando el contenido y comparando en controladores registrados para ese contenido .

A detailed MSDN article también está disponible.

+0

Eso es genial, pero realmente estoy buscando algo que funcione mientras mi software se está ejecutando. Gracias, sin embargo. –

Cuestiones relacionadas