2013-05-18 12 views
12

Ich möchte erkennen, wenn der Benutzer eine USB-Soundkarte eingesteckt oder entfernt. Ich habe es geschafft, um tatsächlich das Ereignis zu fangen, wenn dies geschieht, aber ich kann nicht sagen, was in wurde gerade eingestecktWie erkennt man, welches Gerät an den USB-Steckplatz angeschlossen wurde?

ich einen Ansatz versucht, basierend auf this Frage:.

string query = 
    "SELECT * FROM __InstanceCreationEvent " + 
    "WITHIN 2 " 
    + "WHERE TargetInstance ISA 'Win32_PnPEntity'"; 
var watcher = new ManagementEventWatcher(query); 
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); 
watcher.Start(); 

Während ich die Benachrichtigungen über das Ereignis EventArrived habe ich keine Ahnung, wie ich den tatsächlichen Namen des Geräts ermitteln kann, das gerade angeschlossen wurde. Ich habe jede Eigenschaft durchgesehen und konnte weder Kopf noch Zahl daraus machen.

Ich habe auch versucht, eine andere Abfrage:

var query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent where EventType = 1 or EventType = 2"); 
var watcher = new ManagementEventWatcher(query); 
watcher.EventArrived += watcher_EventArrived; 
watcher.Stopped += watcher_Stopped; 
watcher.Query = query; 
watcher.Start(); 

aber auch ohne Erfolg. Gibt es eine Möglichkeit, den Namen des Geräts zu finden, das angeschlossen oder entfernt wurde?

Unter dem Strich möchte ich wissen, wenn eine USB-Soundkarte eingesteckt oder aus dem System entfernt wird. Es sollte unter Windows 7 und Vista funktionieren (obwohl ich mich nur mit Win7 zufrieden geben werde).

BEARBEITEN: Basierend auf den Vorschlägen des erfolgreichen Übermittlers, habe ich eine full solution erstellt, die alle Funktionen umschließt.

+0

Was ist das RegisterDeviceNotification Ereignis mit? in dieser Bibliothek verwendet zum Beispiel: https://code.google.com/p/winusbnet/ –

+0

@SimonMourier Diese Bibliothek scheint eher für die Kommunikation mit USB-Geräten, anstatt sie zu erkennen. Ich sehe keine Beispiele, die zeigen, wie Geräte erkannt werden, und ich sehe auch nichts in der API, das sich für diesen Zweck eignet. – AngryHacker

Antwort

9

Wenn ich, verwenden Sie Ihren ersten Code kann ich meine Veranstaltung wie folgt definieren:

// define USB class guid (from devguid.h) 
    static readonly Guid GUID_DEVCLASS_USB = new Guid("{36fc9e60-c465-11cf-8056-444553540000}"); 

    static void watcher_EventArrived(object sender, EventArrivedEventArgs e) 
    { 
     ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"]; 
     if (new Guid((string)instance["ClassGuid"]) == GUID_DEVCLASS_USB) 
     { 
      // we're only interested by USB devices, dump all props 
      foreach (var property in instance.Properties) 
      { 
       Console.WriteLine(property.Name + " = " + property.Value); 
      } 
     } 
    } 
so etwas wie dieses

Und das wird Dump:

Availability = 
Caption = USB Mass Storage Device 
ClassGuid = {36fc9e60-c465-11cf-8056-444553540000} 
CompatibleID = System.String[] 
ConfigManagerErrorCode = 0 
ConfigManagerUserConfig = False 
CreationClassName = Win32_PnPEntity 
Description = USB Mass Storage Device 
DeviceID = USB\VID_18A5&PID_0243\07072BE66DD78609 
ErrorCleared = 
ErrorDescription = 
HardwareID = System.String[] 
InstallDate = 
LastErrorCode = 
Manufacturer = Compatible USB storage device 
Name = USB Mass Storage Device 
PNPDeviceID = USB\VID_18A5&PID_0243\07072BE66DD78609 
PowerManagementCapabilities = 
PowerManagementSupported = 
Service = USBSTOR 
Status = OK 
StatusInfo = 
SystemCreationClassName = Win32_ComputerSystem 
SystemName = KILROY_WAS_HERE 

Dies alles enthalten sollte, die Sie benötigen, einschließlich der Geräte-ID, die Sie mit so etwas wie instance["DeviceID"] bekommen kann.

+0

Die DeviceID ist gut und gut, aber wie bekomme ich den Namen des tatsächlichen Geräts, z. 'Sennheiser USB Headset'. – AngryHacker

+0

Haben Sie versucht, diesen Code ohne den GUID_DEVCLASS_USB-Check auszuführen, den ich dort eingegeben habe? Es kann als ein anderer Typ (Klasse) des Geräts identifiziert werden. Wenn Sie beispielsweise ein USB-Laufwerk anschließen, können viele Ereignisse ausgelöst werden (USB-Gerät, Festplatte, Lautstärke usw.). –

+0

Ja, ich habe, aber ich habe das gleiche Problem: Es gibt mir alles außer dem tatsächlichen Gerätenamen. – AngryHacker

3

EDIT 1: Oh, sehen Sie, dass es kein USB-Speichergerät ist, sondern nur ein USB-Gerät. Ich werde nach einer anderen Lösung suchen.


Zwei Links, die das gleiche Problem beschreiben:

http://hintdesk.com/c-catch-usb-plug-and-unplug-event/

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/37123526-83fa-4e96-a767-715fe225bf28/

if (e.NewEvent.ClassPath.ClassName == "__InstanceCreationEvent") 
{ 
    Console.WriteLine("USB was plugged in"); 
    //Get disk letter 
    foreach (ManagementObject partition in new ManagementObjectSearcher(
"ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + mbo.Properties["DeviceID"].Value 
+ "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition").Get()) 
    { 
     foreach (ManagementObject disk in new ManagementObjectSearcher(
        "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" 
         + partition["DeviceID"] 
         + "'} WHERE AssocClass = Win32_LogicalDiskToPartition").Get()) 
     { 
      Console.WriteLine("Disk=" + disk["Name"]); 
     } 
    } 
} 
0

Als ich @AgryHacker Lösung versuchte, bemerkte ich, dass die DeviceChangedEventArgs Klasse nie aufgerufen wurde, obwohl. Ich entfernte es und fügte einfach Console.WriteLines() in die Methoden watcher_eventArrived hinzu.

Neben der Streichung des DeviceChangedEventArgs, hier sind meine Änderungen:

(at line 46 in EstablishedWatchEvents) 
// setup the query to monitor removal 
const string qryRemoval = "SELECT *" + "FROM __InstanceDeletionEvent " 
      + "WITHIN 2 " + "WHERE TargetInstance ISA 'Win32_PnPEntity' "; 

#region Events 

private void insertWatcher_EventArrived(object sender, EventArrivedEventArgs e) 
{ 

    var mbo = (ManagementBaseObject) e.NewEvent["TargetInstance"]; 
    if (new Guid((string) mbo["ClassGuid"]) == GUID_DEVCLASS_USB) 
    { 
     var deviceName = (string) mbo["Name"]; 
     Console.WriteLine(deviceName + " was inserted"); 

    } 
} 

private void removeWatcher_EventArrived(object sender, EventArrivedEventArgs e) 
{ 

    var mbo = (ManagementBaseObject)e.NewEvent["TargetInstance"]; 

    if (new Guid((string)mbo["ClassGuid"]) == GUID_DEVCLASS_USB) 
    { 
     var deviceName = (string)mbo["Name"]; 
     Console.WriteLine(deviceName + " was removed"); 
    } 
} 

#endregion