2009-05-19 6 views
0

J'essaie d'utiliser le code C# suivant pour détecter l'événement attaché/retiré des périphériques de stockage de masse USB . J'utilise Win32_VolumeChangeEvent.L'événement WMI Win32_VolumeChangeEvent fonctionne sur Windows XP


// Initialize an event watcher and subscribe to events that match this query    
var _watcher = new ManagementEventWatcher("select * from Win32_VolumeChangeEvent"); 
_watcher.EventArrived += OnDeviceChanged; 
_watcher.Start(); 

void OnDeviceChanged(object sender, EventArrivedEventArgs args) 
{ 
    Console.WriteLine(args.NewEvent.GetText(TextFormat.Mof)); 
} 

Le problème est que cela fonctionne très bien sur Vista, mais il ne fonctionne pas sur XP du tout (pas d'événement reçu). La documentation Microsoft indique que cela devrait fonctionner (http://msdn.microsoft.com/en-us/library/aa394516(VS.85).aspx). Je ai googlé pendant un certain temps et trouvé d'autres qui ont ce problème aussi. Mais j'ai aussi trouvé quelques articles qui prétendent que ce type de requête (principalement en vbscript) fonctionne avec XP. Mais je ne peux pas trouver des informations officielles de Microsoft pour ce problème et je ne peux pas croire que Microsoft a négligé ce problème pour trois service packs. Donc ma question est: est-ce que quelqu'un a utilisé le Win32_VolumeChangeEvent avec succès sur XP ou peut fournir un lien/explication pourquoi il ne devrait pas fonctionner sur XP?

Répondre

0

Comme vous pouvez le lire dans votre propre link, la version client pris en charge minimale pour Win32_VolumeChangeEvent est Windows Vista. Quoi qu'il en soit, comme suggéré here, vous pouvez exécuter une requête dans l'intervalle dans la portée root\\CIMV2. Voici un exemple d'un de mes codes:

WqlEventQuery query; 
ManagementScope scope; 
ManagementEventWatcher watcher; 
public void DoWork() 
{ 
    // Check if OS Version is earlier than Windows Vista 
    if (USBHandlerWorker.OSVersion() <= 6) 
    { 
     scope = new ManagementScope("root\\CIMV2"); 
     scope.Options.EnablePrivileges = true; 

     query = new WqlEventQuery(); 
     query.EventClassName = "__InstanceCreationEvent"; 
     query.WithinInterval = new TimeSpan(0, 0, 1); 
     query.Condition = @"TargetInstance ISA 'Win32_USBControllerdevice'"; 

     watcher = new ManagementEventWatcher(scope, query); 
     watcher.EventArrived += watcher_EventArrived; 
     watcher.Start(); 
    } 
    else 
    { 
     watcher = new ManagementEventWatcher(); 
     // The event types 2 and 3 are for plug and unplug events 
     query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent " + 
      "WHERE EventType = 2 OR EventType = 3"); 
     watcher.EventArrived += watcher_EventArrived; 
     watcher.Query = query; 
     watcher.Start(); 
    } 
} 
+0

Lorsque j'ai posé cette question il y a six ans, il n'était pas écrit dans la documentation, mais maintenant il l'est. Quoi qu'il en soit, j'espère que personne n'est encore en train de développer pour Windows XP ;-) –

0

"Win32_VolumeChangeEvent .. est disponible uniquement sur Windows Server 2003" - source