2008-11-07 4 views
16

Je suis juste préoccupé par Windows, donc il n'y a pas besoin d'aller en ésotérique sur la compatibilité Mono ou quelque chose comme ça.Comment puis-je détecter l'insertion d'un disque amovible à l'aide de C#?

Je devrais également ajouter que l'application que j'écris est WPF, et je préférerais éviter de prendre une dépendance sur System.Windows.Forms si possible.

+0

ce que nous parlons d'un USB Port? –

+0

Un lecteur USB serait un exemple de disque amovible, mais Windows les traite généralement de la même manière que les lecteurs optiques et autres lorsqu'il s'agit d'événements. –

Répondre

16

Donnez un coup ... ce

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

Dans quel assemblage se trouve le ManagementEventWatcher? –

+0

System.Management, selon cet article MSDN: http://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.aspx – ine

+1

Apparemment, il est dans System.Management.dll - http: // msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.aspx –

1

serait de la façon la plus simple de créer un gestionnaire Autoplay:

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

Autoplay version 2 est une fonctionnalité Windows XP qui va scanner les premiers quatre niveaux d'un support amovible, lorsque il arrive, à la recherche de contenu multimédia types (musique, graphiques ou vidéo). L'enregistrement des applications est effectué sur la base d'un type de contenu. Lorsqu'un support amovible arrive, Windows XP détermine les actions à effectuer par en évaluant le contenu et en comparant aux gestionnaires enregistrés pour le contenu .

Un detailed MSDN article est également disponible.

+0

C'est plutôt cool, mais je cherche vraiment quelque chose qui fonctionnera pendant que mon logiciel fonctionne. Merci quand même. –

Questions connexes