2013-08-15 13 views
9

Ho bisogno di sapere che tipo di dispositivi USB attualmente utilizzati nel sistema. C'è un USB specification sui codici classe dei dispositivi USB. Ma non posso ottenere il tipo di dispositivo, la richiesta WMI WQL: select * from Win32_UsbHub fornisce valori nulli su codice classe, codice sottoclasse, campi tipo protocollo. Qualche idea su come rilevare il tipo di dispositivo USB attualmente in uso?C# rileva dispositivo USB ClassCode (tipo di dispositivo USB)

mio codice corrente:

ManagementObjectCollection collection; 
using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub")) 
{ 
    collection = searcher.Get(); 
    foreach (var device in collection) 
     { 
      var deviceId = (string)GetPropertyValue("DeviceID"); 
      var pnpDeviceId = (string)GetPropertyValue("PNPDeviceID"); 
      var descr = (string)device.GetPropertyValue("Description"); 
      var classCode = device.GetPropertyValue("ClassCode"); //null here 
     } 
} 
+0

puoi pubblicare l'esempio completo, compreso 'ManagementScope',' 'ObjectQuery' e ManagementObjectSearcher' l'uso? – SwDevMan81

+0

Raccolta ManagementObjectCollection; utilizzando (var searcher = new ManagementObjectSearcher (@ "Select * From Win32_USBHub")) collection = searcher.Get(); – MelnikovI

+0

Lo strumento wbemtest.exe ha lo stesso effetto: i campi 'Classe codice, sottoclasse, tipo protocollo' sono nulli – MelnikovI

risposta

4

È possibile scaricare USB View Source come punto di partenza. Questo scorre attraverso tutti i dispositivi USB su un PC (C#) e ricava informazioni su ciascuno. Per ottenere i campi di tipo Class code, Subclass code e Protocol, è necessario modificarlo leggermente. Cambia il seguente ed eseguilo e otterrai le informazioni su ciascun dispositivo USB cliccando sulla voce nella vista ad albero (le informazioni appariranno nel pannello di destra).

Modifiche USB.cs:

// Add the following properties to the USBDevice class 
// Leave everything else as is 
public byte DeviceClass 
{ 
    get { return DeviceDescriptor.bDeviceClass; } 
} 

public byte DeviceSubClass 
{ 
    get { return DeviceDescriptor.bDeviceSubClass; } 
} 

public byte DeviceProtocol 
{ 
    get { return DeviceDescriptor.bDeviceProtocol; } 
} 

Modifiche fmMain.cs

// Add the following lines inside the ProcessHub function 
// inside the "if (port.IsDeviceConnected)" statement 
// Leave everything else as is 
if (port.IsDeviceConnected) 
{ 
    // ... 
    sb.AppendLine("SerialNumber=" + device.SerialNumber); 
    // Add these three lines 
    sb.AppendLine("DeviceClass=0x" + device.DeviceClass.ToString("X")); 
    sb.AppendLine("DeviceSubClass=0x" + device.DeviceSubClass.ToString("X")); 
    sb.AppendLine("DeviceProtocol=0x" + device.DeviceProtocol.ToString("X")); 
    // ... 
} 
+0

Sembra che sia quello di cui ho bisogno, lo proverò. – MelnikovI

+0

@PeterJ - Sembra che i file siano stati ristrutturati, ho aggiornato il collegamento. – SwDevMan81