PureBasic

Forums PureBasic
Nous sommes le Sam 24/Aoû/2019 8:53

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 19 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: Détection de peripheriques USB
MessagePosté: Mar 12/Fév/2019 22:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 29/Juil/2004 16:33
Messages: 2788
Localisation: Klyntar
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:
;- 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.71 Beta 1 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Mer 13/Fév/2019 0:05 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8739
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/windows/desktop/aa364939

Code:
; 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/viewtopic.php?f=1&t=1139&hilit=GetDriveType_

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Mer 13/Fév/2019 6:29 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3483
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 >>.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Mer 13/Fév/2019 7:39 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 16/Oct/2015 18:22
Messages: 309
Localisation: France
Bonjour,

Code:
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 5.70 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Mer 13/Fév/2019 9:35 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
/!\ Windows uniquement
Code:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Mer 13/Fév/2019 10:18 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8739
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 :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Mer 13/Fév/2019 11:08 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 4222
Localisation: Arras, France
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Mer 13/Fév/2019 11:26 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 16/Oct/2015 18:22
Messages: 309
Localisation: France
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 5.70 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Mer 13/Fév/2019 11:37 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3483
@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/driver-api/device_link.html


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Mer 13/Fév/2019 21:35 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 29/Juil/2004 16:33
Messages: 2788
Localisation: Klyntar
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.71 Beta 1 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Ven 15/Fév/2019 14:20 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 17/Déc/2007 12:44
Messages: 1628
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:
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

_________________
Image

Image

Image Official site of PureBasic
Image Official site of SpiderBasic

Configuration : Tower: Windows 7 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.62 (x86 et x64)


Dernière édition par GallyHC le Ven 15/Fév/2019 20:01, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Ven 15/Fév/2019 15:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 16/Oct/2015 18:22
Messages: 309
Localisation: France
Bonjour,

Je suis certainement hors sujet.

Comment détecter si un adaptateur USB Serial-Port est connecté au PC
Code:
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 5.70 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Ven 15/Fév/2019 15:44 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 16/Oct/2015 18:22
Messages: 309
Localisation: France
La même méthode, mais pour les disques de A: a Z:
Code:
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 5.70 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Ven 15/Fév/2019 17:11 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 29/Juil/2004 16:33
Messages: 2788
Localisation: Klyntar
@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.71 Beta 1 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Détection de peripheriques USB
MessagePosté: Sam 16/Fév/2019 9:31 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 17/Déc/2007 12:44
Messages: 1628
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

_________________
Image

Image

Image Official site of PureBasic
Image Official site of SpiderBasic

Configuration : Tower: Windows 7 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.62 (x86 et x64)


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 19 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 10 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye