Détection de peripheriques USB

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Détection de peripheriques USB

Message par venom »

Bonjour,

Voilà je viens de me pencher sur une des façon qui me permettrai de trouver les lettres des différant périphériques connecter sur un ordinateur.

J'ai bien trouver une façon mais je souhaiterai savoir si vous vous êtes déjà penchez sur le sujet, ou de quel façon auriez vous fait ?

Pour ma part, voici ma façon de faire :

Je créer un ComboBox avec les 26 lettres de l'alphabet.
A:/
B:/
C:/
etc..

De la, j'essaie de créer un fichier quelconque dans chaque-une des lettres. Si le résultat est positif c'est que le périphérique existe bien.
Je récupère donc cette lettre Ex : E:/ que je sauvegarde dans un fichier pref. Et je contiune ça jusqu'a la lettre Z:/

Ensuite je vide ma ComboBox et j'affiche uniquement le ou les lettres retenue dans mon fichiers pref. Et je supprime tout les fichiers précédemment créer.

Voilà grosso-modo ma façon de faire. Personnellement je trouve ça un peut "fouillons" mais le résultat est la. Qu'en pensez vous ? Peut être que je me suis trop pris la tête :lol: (ce qui est fort probable)

En attendant vos retours (votre façon de faire, ou si mon code fonctionne bien chez vous). Voici mon code "test".

Merci.

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window_0
EndEnumeration

;- gadgets Constants
Enumeration
  #combo_0
EndEnumeration

Declare LettreDissponible()

  If OpenWindow(#Window_0, 0, 0, 350, 100, "Détection des disques amovibles", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
    
    ComboBoxGadget(#Combo_0, 10, 10, 320, 20)
    AddGadgetItem(#Combo_0, 0, "A:/", 0)
    AddGadgetItem(#Combo_0, 1, "B:/", 0)
    AddGadgetItem(#Combo_0, 2, "C:/", 0)
    AddGadgetItem(#Combo_0, 3, "D:/", 0)
    AddGadgetItem(#Combo_0, 4, "E:/", 0)
    AddGadgetItem(#Combo_0, 5, "F:/", 0)
    AddGadgetItem(#Combo_0, 6, "G:/", 0)
    AddGadgetItem(#Combo_0, 7, "H:/", 0)
    AddGadgetItem(#Combo_0, 8, "I:/", 0)
    AddGadgetItem(#Combo_0, 9, "J:/", 0)
    AddGadgetItem(#Combo_0, 10, "K:/", 0)
    AddGadgetItem(#Combo_0, 11, "L:/", 0)
    AddGadgetItem(#Combo_0, 12, "M:/", 0)
    AddGadgetItem(#Combo_0, 13, "N:/", 0)
    AddGadgetItem(#Combo_0, 14, "O:/", 0)
    AddGadgetItem(#Combo_0, 15, "P:/", 0)
    AddGadgetItem(#Combo_0, 16, "Q:/", 0)
    AddGadgetItem(#Combo_0, 17, "R:/", 0)
    AddGadgetItem(#Combo_0, 18, "S:/", 0)
    AddGadgetItem(#Combo_0, 19, "T:/", 0)
    AddGadgetItem(#Combo_0, 20, "U:/", 0)
    AddGadgetItem(#Combo_0, 21, "V:/", 0)
    AddGadgetItem(#Combo_0, 22, "W:/", 0)
    AddGadgetItem(#Combo_0, 23, "X:/", 0)
    AddGadgetItem(#Combo_0, 24, "Y:/", 0)
    AddGadgetItem(#Combo_0, 25, "Z:/", 0)
    
    LettreDissponible() ; appel la procedure qui trouve les peripheriques
    
  EndIf 

  Repeat
   EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
          

      EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow
  
  
  
  
Procedure LettreDissponible()
CreatePreferences(GetHomeDirectory()+"CDA", 0) ; creer un fichier pour sauvegarder les peripheriques compatibles


For a = 0 To 25 ; creer une boucle des 26 lettres de l'alphabet
 ResultatLettre = CreateFile(a, GetGadgetItemText(#Combo_0, a, 0)+"CDA", 0) ; essaie de crée un fichier dans tout les peripherique de A a Z

 If ResultatLettre > 0 ; verifie si le fichier est bien creer 
  WritePreferenceString(Str(a), GetGadgetItemText(#Combo_0, a, 0)) ; si oui, on enregistre la lettre dans le fichier pref
   CloseFile(a) ; on ferme le ou les fichiers creer dans les peripheriques qui a permis a la detection pour une future supression
 EndIf 
Next 


ClearGadgetItems(#Combo_0) ; on vide la ComboBox


 ExaminePreferenceKeys() ; commence l'ennumération dans le fichier pref
  While  NextPreferenceKey() ; clef suivante
    AddGadgetItem(#Combo_0, Val(PreferenceKeyValue()), PreferenceKeyValue(), 0, 0) ; on affiche la lettre dissponible dans la ComboBox
     DeleteFile(PreferenceKeyValue()+"CDA") ; on supprime le ficher creer dans le peripherique qui a permis a la détection
  Wend
ClosePreferences() ; on referme le fichier pref apres scan pour une future suppression

SetGadgetState(#Combo_0, 0) ; on affiche par defaut le 1er elements dans la ComboBox

DeleteFile(GetHomeDirectory()+"CDA")
EndProcedure





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Détection de peripheriques USB

Message par Ar-S »

Yop Venom,
Mets ton CloseFile(a) après ton endif parce que pour le moment, si pour une raison x ou y ton If ResultatLettre > 0 ne passe pas, ton fichier ne se ferme jamais.
Dans l'idée je n'aime pas forcément écrire un fichier pour détecter un périph.

Sous windows (api oblige) je préfère ça (je n'ai mis que les lecteurs amovibles et non amovibles inscriptibles)
Testé avec 1 clé usb sur un de mes ports, elle est bien listée.
Tu peux ajouter à ta guise DRIVE_RAMDISK etc

Plus d'infos ici : https://msdn.microsoft.com/fr-fr/window ... p/aa364939

Code : Tout sélectionner

; lister lecteur amovible
For I = 67 To 90
  If GetDriveType_(Chr(I)+":\")=#DRIVE_REMOVABLE
    Debug Chr(I)+":\" + " Périph amovible (Cle usb..)"
  ElseIf GetDriveType_(Chr(I)+":\")=#DRIVE_FIXED
    Debug Chr(I)+":\" + " Disque non amovible (disque dur, ssd..)"
  EndIf
Next

Une version de Flype ici
https://www.purebasic.fr/french/viewtop ... DriveType_
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Détection de peripheriques USB

Message par Ollivier »

Tiens?

@Ar-S

Pourquoi pars-tu de 67 ? D'instinct, je partirai plutôt de 65...

@Venom

Je ne pense pas que ce soit un mauvais plan ton truc. Seulement, du même avis qu'Ar-S (contre écrire à chaque test), tu peux juste lire. Tu n'es pas non plus contraint de faire intervenir la GUI : ça peut être complètement discret et averti par un ProgressBar titré << Recherche des lecteurs >>.
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Détection de peripheriques USB

Message par cage »

Bonjour,

Code : Tout sélectionner

EnableExplicit

Define enum, Disque$

For enum = 0 To 25 ; 26 letters A->Z  code 65 to 90
  Disque$ = Chr(65 + enum) + ":\"
  If FileSize(Disque$) = -2
    Debug Disque$
  EndIf
Next
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Détection de peripheriques USB

Message par boby »

/!\ Windows uniquement

Code : Tout sélectionner

EnableExplicit
Define bitmask.l, one.l, LoopCount, Drive$
bitmask.l = GetLogicalDrives_()
one.l = 1
For LoopCount = 0 To 31
  If bitmask & one << LoopCount
    Drive$ = Chr(65+LoopCount)+":"
    Debug Drive$ + " : " + GetDriveType_(Drive$)
  EndIf
Next LoopCount
Pour le type de lecteur voir La doc microsoft
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Détection de peripheriques USB

Message par Ar-S »

Ollivier a écrit : Pourquoi pars-tu de 67 ? D'instinct, je partirai plutôt de 65...
Parce que depuis plus de 10 voir 20 ans je n'ai plus croisé de A et B. Mais effectivement on peut tout mettre ça coute pas grand chose.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Détection de peripheriques USB

Message par djes »

Oulà... De mémoire (peux pas chercher là, j'ai une très mauvaise connexion), il peut aussi y avoir des double-lettres (AA), et donc faire une recherche comme ça en essai-erreur me semble être une mauvaise idée. Il doit bien y avoir une liste des lecteurs renvoyée par une fonction de Microsoft, ou peut-être via le registre.
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Détection de peripheriques USB

Message par cage »

Les seules lettres disponibles a ma connaissance vont de A a Z

Il existait a une certaine époque la commande LASTDRIVE= a positionner dans config.sys

Pour que la dernière lettre possible soit H, il suffisait d'indiquer LASTDRIVE=H
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Détection de peripheriques USB

Message par Ollivier »

@Djes

FindFirstVolume_()
et FindNextVolume_() à mettre en boucle.

et pour "pécho" tout ce qui bouge sur USB :

SetupDiEnumDeviceInterfaces_()
SetupDiGetDeviceInterfaceDetail_()

Remarque : il y a ce machin aussi : A5DCBF10-6530-11D2-901F-00C04FB951ED qui donne sur un lien ici sur ce forum.
(ça, c'est sous Windows)

Et pour faire la même sous Linux, c'est orienté objet donc la Shakespeare Doc pour les aventuriers ! ::

https://www.kernel.org/doc/html/v4.15/d ... _link.html
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Détection de peripheriques USB

Message par venom »

Merci a tous pour vos suggestions/codes. C'est ça que j'aime avec PB tellement de facon différentes pour arrivé au même résultat 8)

Je vais étudier vos codes pour comprendre votre façon de faire.

C'est sur que je me suis doutée qu'une API windows devait existé. Mais bon si on peut faire sans pourquoi pas.

Personnellement, j'ai dit que mon code était "fouillon", car je suis comme vous pas trop fan d'enregistrer des fichiers à droite a gauche.
Donc je comptais sur vos compétences pour me montrer votre façon de penser. Car ce code je l'ai écrit directement sortie de la tête. "Brute sans trop de réflexion" :) C'est l'idée qui m'ai venu sans même chercher sur le forum. :wink:

Encore merci.







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Détection de peripheriques USB

Message par GallyHC »

Bonjour,

Je sais que je suis un peu hors sujet, mais cela peut aussi être utile après que tout les lecteurs on été détecté (je penses que la pas mal on répondu). Le code que je te propose permet de détecter si on ajoute ou retire un périphérique.

Code : Tout sélectionner

EnableExplicit

Procedure.s DriveMaskToString(mask.i)
  ;
  Protected.s sresul = #Null$
  Protected.s drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  Protected.i i, pow
  ;
  pow = Int(mask / 2)
  While pow <> 0
    pow = Int(pow / 2)
    i + 1
  Wend
  If i < Len(drives)
    sresul = Mid(drives, i + 1, 1)
  EndIf
  ;
  ProcedureReturn sresul

EndProcedure

Procedure WindowCallback(hWnd.i, uMsg.i, wParam.i, lParam.i)
  ;
  Protected.b drivelocate = #False
  Protected.b drivedetect = #False
  ;
  Select uMsg
    Case #WM_DEVICECHANGE
      Select wParam
        Case #DBT_DEVNODES_CHANGED
          ;
        Case #DBT_DEVICEARRIVAL
          drivedetect = #True
        Case #DBT_DEVICEREMOVECOMPLETE
          drivedetect   = #True
      EndSelect
      ;
      If drivedetect = #True And lParam > 0
        Protected *pDBHDR.DEV_BROADCAST_HDR = lParam
        Select *pDBHDR\dbch_devicetype
          Case #DBT_DEVTYP_OEM
            Protected *pDBO.DEV_BROADCAST_OEM = lParam
            Protected oemID.i = *pDBO\dbco_identifier
          Case #DBT_DEVTYP_PORT
            Protected *pDBP.DEV_BROADCAST_PORT = lParam
            Protected portName.s = PeekS(*pDBP + OffsetOf(DEV_BROADCAST_PORT\dbcp_name))
            ;
            Debug portName
            ;
          Case #DBT_DEVTYP_VOLUME
            ;
            ;
            ;
            Protected *pDBV.DEV_BROADCAST_VOLUME = lParam
            Protected sdrive.s = DriveMaskToString(*pDBV\dbcv_unitmask)
            If sdrive <> #Null$
              Debug "Drive : " + sdrive
            EndIf
            ;
            ;
            ;
          Case #DBT_DEVTYP_DEVICEINTERFACE
            ;
          Case #DBT_DEVTYP_HANDLE
            ;
        EndSelect
      EndIf
      ;
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents
  
EndProcedure

Define event.l
If OpenWindow(1,10,10,320,200,"Test Usb",#PB_Window_SystemMenu )
  SetWindowCallback(@WindowCallback())
  Repeat
    event=WaitWindowEvent(1)
  Until Event=#PB_Event_CloseWindow
  ;  
EndIf
Lancer et juste par exemple mettre un clé USB. Et en espérant que cela n'est pas trop hors sujet.

Cordialement
GallyHC
Dernière modification par GallyHC le ven. 15/févr./2019 20:01, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Détection de peripheriques USB

Message par cage »

Bonjour,

Je suis certainement hors sujet.

Comment détecter si un adaptateur USB Serial-Port est connecté au PC

Code : Tout sélectionner

EnableExplicit

Procedure searchSerial()
  #BUFFERSIZE = 128
  #MAX_SERIAL = 255
  
  Protected Result.l
  Protected SName$
  
  Protected Buffer${#BUFFERSIZE}

  Buffer$ = Space(#BUFFERSIZE)
  
  Protected Serial.i
  
  For Serial = 1 To #MAX_SERIAL
    SName$ = "COM" + Serial + Chr(0)
    Result = QueryDosDevice_(SName$, @Buffer$, #BUFFERSIZE)
    If Result
      Debug "COM"+Str(Serial)
    EndIf
  Next
EndProcedure

searchSerial()
Les PC équipés de port COM sont très rares aujourd'hui, donc il y a une chance que se soit un port USB
CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Détection de peripheriques USB

Message par cage »

La même méthode, mais pour les disques de A: a Z:

Code : Tout sélectionner

EnableExplicit

Procedure searchDisk()
  #BUFFERSIZE = 128
  #MAX_SERIAL = 255
  
  Protected Result.l
  Protected SName$
  
  Protected Buffer${#BUFFERSIZE}

  Buffer$ = Space(#BUFFERSIZE)
  
  Protected Enum.i
  
  For enum = 0 To 25 ; 26 letters A->Z  code 65 to 90
    SName$ = Chr(65 + Enum) + ":"
    Result = QueryDosDevice_(SName$, @Buffer$, #BUFFERSIZE)
    If Result
      Debug SName$ + " -> " + Buffer$
    EndIf
  Next
EndProcedure

searchDisk()
CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Détection de peripheriques USB

Message par venom »

@GallyHC

Non c'est pas si hors sujet que ça :wink: Disons que ça reste dans le sujet.

@caga
L'idée m'est venu car j'avais un code pour détecter les ports COM. Et je me suis dit "pourquoi pas les périphériques USB" :)







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Détection de peripheriques USB

Message par GallyHC »

Bonjour,

Juste pour information le code que j'ai proposé détecte aussi l'ajout des ports "Com", forcement cela est utilisable si on a déjà détecté les port "Com" de base avec le code de "cage".

Cordialement
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Répondre