2013-08-13 17 views
6

Ho bisogno di scorrere le porte collegate al computer e trovare un dispositivo specifico. Si prega di dare un'occhiata alle immagini qui sotto:Come trovare i dispositivi USB in C#?

enter image description here

Si può vedere ci sono 4 i nomi dei dispositivi con lo stesso fornitore e del prodotto id. ma, ho bisogno di trovare la porta del primo, che è evidenziato in colore blu. sembra che l'unica differenza che hanno è il nome dell'amico (la descrizione è il nome dell'amico).

Qual è il modo più semplice per ottenere questo in C# .net? Ho fatto questo in "qt" e ho bisogno di sapere come farlo in C#, .net framework 4, usando vs 2010 professional. Ho risposto a domande come this ma, come puoi vedere, non aiutano la mia situazione.

+0

possibile duplicato di [ottenere l'elenco dei dispositivi USB collegati] (http://stackoverflow.com/questions/3331043/get-list-of-connected-usb-devices) –

risposta

8

Se si utilizza libusbdotnet si dovrebbe essere in grado di fare qualcosa del genere:

public static void RetrieveUSBDevices(int vid, int pid) 
{ 
     var usbFinder = new UsbDeviceFinder(vid, pid); 
     var usbDevices = new UsbRegDeviceList(); 
     usbDevices = usbDevices.FindAll(usbFinder); 
} 

si dovrebbe quindi essere in grado di scorrere le usbDevices e controllare il corretto FullName. Non è stato provato questo, quindi è teorico.

UPDATE: Provato e ha funzionato bene - qual è il problema? Perché votare a causa della tua incompetenza?

Questo potrebbe anche funzionare:

private static void Method() 
{ 
var list = GetMyUSBDevices(); 
//Iterate list here and use Description to find exact device 
} 


private static List<UsbDevice> GetMyUSBDevices() 
{ 
    var vid = 32903; 
    var pid = 36; 

    ManagementObjectCollection collection; 
    using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub")) 
     collection = searcher.Get(); 

    var usbDevice = 
     (from ManagementBaseObject device in collection 
     select new UsbDevice(
     (string) device.GetPropertyValue("DeviceID"), 
     (string) device.GetPropertyValue("Description"))).ToList(); 

    var devices = new List<UsbDevice>(); 

    foreach (var device in collection) 
    { 
     devices.Add(new UsbDevice(
     (string)device.GetPropertyValue("DeviceID"), 
     (string)device.GetPropertyValue("Description") 
     )); 
    } 

    collection.Dispose(); 

    return (from d in devices where d.DeviceId.Contains("VID_") && d.DeviceId.Contains("PID_") && d.PID.Equals(pid) && d.VID.Equals(vid) select d).ToList(); 
} 

public class UsbDevice 
{ 
    public UsbDevice(string deviceId, string description) 
    { 
     DeviceId = deviceId; 
     Description = description; 
    } 

    public string DeviceId { get; private set; } 
    public string Description { get; private set; } 

    public int VID 
    { 
     get { return int.Parse(GetIdentifierPart("VID_"), System.Globalization.NumberStyles.HexNumber); } 
    } 

    public int PID 
    { 
     get { return int.Parse(GetIdentifierPart("PID_"), System.Globalization.NumberStyles.HexNumber); } 
    } 

    private string GetIdentifierPart(string identifier) 
    { 
     var vidIndex = DeviceId.IndexOf(identifier, StringComparison.Ordinal); 
     var startingAtVid = DeviceId.Substring(vidIndex + 4); 
     return startingAtVid.Substring(0, 4); 
    } 
} 
+4

Il downvoter si preoccupa di elaborare? –

+0

Grazie mille per la risposta. Non ho usato noi lib. Il secondo metodo sembra non dare quello che stavo cercando. Non riesco a ottenere il nome dell'amico non lo è –

+0

In ogni caso, in caso di libusb, ha un sistema di installazione speciale o può essere facilmente usato come qualsiasi C# lib? Prego help –

Problemi correlati