2017-05-29 1 views
0

C# J'ai un concentrateur USB de 10 fentes USB connectées à mon port USB. Je veux que le périphérique USB soit connecté au port spécifique.
Exemple: Deux USB sont connectés au Slot 3 et Slot 7. Donc, je veux une liste qui montrera le Slot 3 et le Slot 7 ont le port USB et le slot de repos sont vides. J'ai essayé d'utiliser WMI Query Win32_USBHub. Mais ici, je ne reçois que 6 identifiants de périphériques et non 10. Je différencie les ports en utilisant le VID commun pour l'ID de périphérique. Mais encore après avoir connecté l'USB au port spécifique. Je veux obtenir leur emplacement correspondant dans lequel ils sont connectés à USBHub. Je ne suis pas en mesure d'identifier l'emplacement dans lequel l'USB est connecté et l'emplacement vide.C# Trouvez l'emplacement spécifique du concentrateur USB (10 emplacements) sur lequel l'USB est connecté ou non. Je veux obtenir la fente spécifique non où l'USB est connecté ou non

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

Répondre

0

Je voudrais essayer d'extraire location information du dispositif USB (le même que dans le gestionnaire de périphériques) ... Je ne suis pas le code dans C# ni WMI mais vous devriez être en mesure d'obtenir cette genre d'info avec setupapi.h qui fait partie de winapi (je pense) je le fais comme ça dans C++/VCL:

#include <setupapi.h> 
bool USBinfo() 
    { 
    int i,n; 
    AnsiString s,txt=""; 
    DWORD dwSize,dwPropertyRegDataType; 
    HDEVINFO hDevInfo; 
    SP_DEVINFO_DATA DeviceInfoData; 
    TCHAR szDesc[1024]; 

    // List all connected USB devices 
    hDevInfo = SetupDiGetClassDevs(NULL, TEXT("USB"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); 
    if (hDevInfo == INVALID_HANDLE_VALUE) return false; 
    for (i=0;;i++) 
     { 
     DeviceInfoData.cbSize = sizeof(DeviceInfoData); 
     if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData)) break; 
     SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize); 
     s=szDesc; n=48; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" "; // this just set constant string size to allign the columns to n chars 
     SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize); 
     s=szDesc; if (s=="USB\\VID_????&PID_????REV_????") 
      { 
      // here you can do custom stuff for specific VID,PID just change the ???? in above line to your specific VID,PID,REV 
      } 
     s=szDesc; n=64; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" "; 
     SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_LOCATION_INFORMATION,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize); 
     s=szDesc; n=64; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" "; 
     txt+="\r\n"; 
     } 
    Main->mm_log->Lines->Add(txt); // this just output txt string to memo 
    return true; 
    } 

ici sortie sur ma machine:

USB Root Hub          USB\ROOT_HUB&VID1022&PID7807&REV0011        USB\ROOT_HUB&VID1022&PID7807&REV0011        
USB Root Hub          USB\ROOT_HUB&VID1022&PID7807&REV0011        USB\ROOT_HUB&VID1022&PID7807&REV0011        
USB Root Hub          USB\ROOT_HUB&VID1022&PID7809&REV0011        USB\ROOT_HUB&VID1022&PID7809&REV0011        
USB Root Hub          USB\ROOT_HUB20&VID1022&PID7808&REV0011       USB\ROOT_HUB20&VID1022&PID7808&REV0011       
USB Root Hub          USB\ROOT_HUB20&VID1022&PID7808&REV0011       USB\ROOT_HUB20&VID1022&PID7808&REV0011       
USB Composite Device        USB\VID_048D&PID_9006&REV_0200         Port_#0001.Hub_#0004            
IT9135 BDA Device        USB\VID_048D&PID_9006&REV_0200&MI_00        0000.0013.0002.001.000.000.000.000.000       
USB Input Device         USB\VID_048D&PID_9006&REV_0200&MI_01        0000.0013.0002.001.000.000.000.000.000       
Canon LiDE 30         USB\VID_04A9&PID_220E&REV_0100         Port_#0005.Hub_#0001            
American Power Conversion USB UPS    USB\VID_051D&PID_0002&REV_0106         Port_#0001.Hub_#0001            
USB Input Device         USB\Vid_093A&Pid_2510&Rev_0100         USB Optical Mouse             
USB Input Device         USB\VID_413C&PID_2107&REV_0115         Port_#0002.Hub_#0001            

Comme vous pouvez le voir la dernière colonne (3ième) contient l'information que vous voulez. Regardez à l'intérieur setupapi.h pour tous les SPDRP_ définit que vous pouvez utiliser ... La seule chose utilisée de VCL est AnsiString alors changez-le à n'importe quel type de chaîne que vous avez à votre disposition. Ce numéro n'est pas limité à USB. Si vous voulez que tous les appareils changent alors paramètre TEXT("USB") de recherche pour NULL

hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); 
+0

J'ai aussi essayé l'approche similaire. La sortie que vous avez montrée ici montre DeviceID pour chaque périphérique présent sous les contrôleurs USB dans DeviceManager. Cependant, je suis à la recherche des détails de localisation exacte du gestionnaire de périphériques. Les détails de l'emplacement s'affichent sous la forme Port_ # 0003.Hub_ # 0003. Mais ici, il montre juste VID, PID & REV qui n'aidera pas à identifier le numéro de slot de l'USBHub. –

+0

@RahulAnand rouler la barre de défilement vers la droite les emplacements sont après la colonne PID VID comme 'Port_ # 0005.Hub_ # 0001' – Spektre

+0

@Spektre ... Merci de fournir une approche d'analyse correcte. Bien que j'aie essayé d'utiliser C# mais je n'arrive toujours pas à trouver la propriété Location correctement. Je travaille toujours dessus. Mais en effet, c'est l'approche de solution correcte que vous avez fournie. Cela m'a vraiment aidé. –