Detecter le branchement d'un media USB

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Detecter le branchement d'un media USB

Message par doudouvs »

Bonjour,

Je cherche sous windows comment détecter le branchement d'un media USB clé/hdd ect...

Si vous avez une piste

Merci
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Detecter le branchement d'un media USB

Message par Backup »

une piste :
http://www.purebasic.fr/french/viewtopi ... usb#p93200

c'est pour deconecter, mais je supose qu'il ne dois pas y avoir beaucoup de chose a changer

de plus, il me semble, que le fait de surveiller le lecteur xx:\ peut suffire a voir qu'il soit accessible ou pas ..
lorsqu'on branche un periphe USB, ça ouvre en fait un lecteur (comme une partition, pour un disque
et lui attribut une Lettre D:\...E:\...F:\ etc ....

donc, peut etre qu'en essayant d'ecrire ou de lire dans ce lecteur on peut savoir s'il existe ...
a tester ....
il faudrai chercher la Signature du periph , pour savoir s'il est connecté ou pas...

ps: c'est une supposition.. j'ai jamais chercher dans ce domaine :)
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: Detecter le branchement d'un media USB

Message par doudouvs »

Ben la cela veux dire que je doit lire continuellement pour voir si il y a un lecteur et brancher ca va manger de la ressource pour rien or il doit bien avoir un événement que l'on peut intercepter.

Quand on branche une clé, windows monte bien le lecteur seul comme un grand

à la limite peut etre il y a moyen de voir ca dans un fichier log, on lit continuellement le fichier de log if mount USB else ....

J'ai l'impression qu'il ne sera pas possible de ce passer d'un deamon
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Detecter le branchement d'un media USB

Message par falsam »

En fouillant un peu mes archives, un code de Droopy

Code : Tout sélectionner

;/ Droopy 28/11/05 
; Return 1 if a Removable Media is detected ( Probably a USB Key ) / 0 instead 

Procedure DetectUSBKey() 
  For n=0 To 26 
    If RealDriveType_(n,0)=  #DRIVE_REMOVABLE
      Debug Chr(n+65)+": Drive is a Removable Drive" 
    EndIf 
  Next 
EndProcedure 

DetectUSBKey() 
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Detecter le branchement d'un media USB

Message par GallyHC »

Bonjour,

Une petite source pour savoir ce qui est connecter et ce qui est retirer. En gros on prend une image des lecteurs après tout les x seconde(s) on test voir si il y a eu un changement ou pas.

Code : Tout sélectionner

DisableASM
EnableExplicit
;
; INIT
;
Define.i i, event
Define sdrive.s
Dim tdrive.b(25)
;
; INIT
;
Enumeration
  #Window_0
EndEnumeration
Enumeration
  #Timer_1
EndEnumeration
;
; MAIN DU PROGRAMME.
;
Define hWnd.l = OpenWindow(#Window_0, 0, 0, 400, 200, "Drive detect", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
If hWnd <> 0
  ;
  ; TIMER TOUT LES 2 SECONDES (2 * 1000)
  ;
  AddWindowTimer(#Window_0, #Timer_1, 2000)
  ;
  ; ON PREND UNE IMAGE INITIALE DES LECTEURS.
  ;
  For i=2 To 25
    If PathFileExists_(Chr(65 + i) + ":\")
      tdrive(i) = #True
    EndIf
  Next i
  ;
  ; MAIN AVEC TIMER DE VERIFICATION DES LECTEURS.
  ; 
  Repeat
    event   = WaitWindowEvent(50)
    
    If event = #PB_Event_Timer And EventTimer() = #Timer_1
      Debug "On test :"
      ;
      ; ON COMMENCE A 2 POUR EVITER A:/ et B:/
      ;
      For i=2 To 25
        sdrive = Chr(65 + i) + ":\"
        If PathFileExists_(sdrive)
          If tdrive(i) <> #True
            ;
            ; ON A TROUVER UN NOUVEAU LECTEUR.
            ;
            tdrive(i) = #True
            Debug "nouveau lecteur en " + sdrive
          EndIf
        Else
          If tdrive(i) = #True
            ;
            ; ON A PERDU UN LECTEUR (DECONNECTER).
            ;
            tdrive(i) = #False
            Debug "lecteur deconecter en " + sdrive            
          EndIf
        EndIf
      Next i
    EndIf
  Until event = #PB_Event_CloseWindow
EndIf
Pour un téléchargement facile (sans copier/coller), j'ai mis l'exemple sur PBFrance à l'adresse "http://pbfrance.com/?url=source&cmd=viewer&val=34".

Sinon cela revient a ce que dit Dobro, mais j'utilise ce genre de code depuis pas mal de temps et sa bouffe rien en ressource.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Detecter le branchement d'un media USB

Message par Backup »

le Code que Falsam propose, ne sert qu'a lister si un peripherique est Removable

il ne dis pas si le peripherique se connecte ...


bon je t'ai fait un exemple , je suis allez chercher les renseignement dans Les APi MicroMoux
voila un Code qui devrai te plaire :)

Code : Tout sélectionner

Declare  WindowCallback(WindowID,message,wParam,lParam)

Openwindow(1,10,10,320,200,"Test Usb",#PB_Window_SystemMenu )
SetWindowCallback(@WindowCallback())

Repeat
	Event=WaitWindowEvent(1)
	
until Event=#PB_Event_CloseWindow
End




Procedure WindowCallback(WindowID,message,wParam,lParam)
	; By Dobro 
	; Detection Periph
	res=#PB_ProcessPureBasicEvents
	Select message
		Case #WM_DEVICECHANGE
		Select wParam
			
			Case #DBT_DEVNODES_CHANGED  ;A device has been added to or removed from the system.
			
			debug "modification  Periph "+str(lParam)
			Case #DBT_DEVICEREMOVECOMPLETE
			debug " Periph Retiré"
			Case #DBT_DEVICEARRIVAL
			Debug "Nouveau Periph Actif !! "
		EndSelect
		
	EndSelect
	ProcedureReturn res
EndProcedure
; Epb

Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Detecter le branchement d'un media USB

Message par falsam »

Dobro a écrit :le Code que Falsam propose, ne sert qu'a lister si un peripherique est Removable
Tu as raison je le suis tromper de code.

C'est un code que propose Rashad en 2011 que je voulais proposer !!

Code : Tout sélectionner

Procedure USB_CBack(hwnd, uMsg, wParam, lParam)
 result = #PB_ProcessPureBasicEvents
   Select uMsg
       Case #WM_DEVICECHANGE
          Select wParam
             Case #DBT_DEVICEARRIVAL
                MessageRequester("USB Status :","USB Device Inserted",#PB_MessageRequester_Ok)
                
             Case #DBT_DEVICEREMOVECOMPLETE
                MessageRequester("USB Status :","USB Device Removed",#PB_MessageRequester_Ok)
                
          EndSelect
   EndSelect
ProcedureReturn result 
EndProcedure

OpenWindow(0,0,0,300,300,"Test",#PB_Window_SystemMenu|#PB_Window_Minimize)

SetWindowCallback(@USB_CBack())


Repeat
  Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = 1
   EndSelect
Until Quit = 1
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Detecter le branchement d'un media USB

Message par Backup »

le meme que le miens en fait ;)

perso mes infos , je les tires d'ici :

http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Detecter le branchement d'un media USB

Message par GallyHC »

Bonjour,

Une petite question, y a t'il moyen de savoir si le périphérique est physique ou logique. Si logique avoir la lettre qui lui est affecté (ne sachant pas de demande a tout hasard).

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Detecter le branchement d'un media USB

Message par Backup »

.......... voir plus bas
Dernière modification par Backup le sam. 19/juil./2014 12:08, modifié 1 fois.
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

[resolu] - Detecter le branchement d'un media USB

Message par doudouvs »

Merci pour vos sources c'est nickel

@Dobro exactement ce que je chercher, bon la c'est du tout cuit :)
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Detecter le branchement d'un media USB

Message par GallyHC »

Bonjour,

Déjà merci "Dobro" pour ce code, mais (y en a toujours ;)), perso avec Windows 7 (64bits) (ou cas ou cela aide) il ne me donne pas d'info sur le périphérique (la une simple clé USB). J'ai juste comme ceci :

Code : Tout sélectionner

modification  Periph 
modification  Periph 
modification  Periph 
Nouveau Periph Actif !! 
modification  Periph 
modification  Periph 
modification  Periph 
modification  Periph 
modification  Periph 
 Periph Retiré
modification  Periph 
Pour ma propre compréhension, je ne comprend le code a partir de :

Code : Tout sélectionner

  *GetVolumeNameForVolumeMountPoint = GetFunction(dll_Kernel32, "GetVolumeNameForVolumeMountPointA")
  
  ; On récupère le nom de volume du lecteur
  *VolumeName = AllocateMemory(255)
  DriveLetter.s + ":\"
  CallFunctionFast(*GetVolumeNameForVolumeMountPoint, @DriveLetter.s , *VolumeName, 255)
  DriveVolume=  PeekS(*VolumeName)
  FreeMemory(*VolumeName)
je ne vois pas du tout ou "DriveLetter" est trouver car non utiliser avant et "*VolumeName" est juste Allouer aussi avant donc pas d'info particulière non? la comprend pas du tout.

Donc pour moi "DriveLetter.s + ":\"", donnera toujours ":\", non?

Merci d'avance,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Detecter le branchement d'un media USB

Message par Backup »

apres quelques recherches , voici ou j'en suis :)



ce Code detecte si on branche un lecteur ou une carte SD

puis affiche la liste complete des Peripheriques USB et CDROM Disques Dur

sous la forme "
[13 :06 :22] *********** La Liste ************
[13 :06 :22] Drive :-->C:\ de Type :-->Fixed_disk_drive avec le Label :-->OS_Install
[13 :06 :22] Drive :-->D:\ de Type :-->CDROM_drive avec le Label :-->
[13 :06 :22] Drive :-->E:\ de Type :-->Fixed_disk_drive avec le Label :-->Dobro
[13 :06 :22] Drive :-->F:\ de Type :-->CDROM_drive avec le Label :-->XPLANE10
[13 :06 :22] Drive :-->G:\ de Type :-->CDROM_drive avec le Label :-->
[13 :06 :22] Drive :-->H:\ de Type :-->Removable_media_drive avec le Label :-->
[13 :06 :22] Drive :-->I:\ de Type :-->Fixed_disk_drive avec le Label :-->My
[13 :06 :22] *******************************
"

ce qui du coup nous renvoi les lettres de lecteurs , le Type de lecteur , et son Label !
le tout etant présent dans une List() , il est facile de voir le nouvel Arrivant, et donc de ressortir
soit sa lettre, soit son label ; .. voir les 2 .. ce qui permettrai d'explorer par la suite :)

voici le Code :

Code : Tout sélectionner

Declare  WindowCallback(WindowID,message,wParam,lParam)
Declare.s  list()
Global NewList Drive.s()
Openwindow(1,10,10,320,200,"Test Usb",#PB_Window_SystemMenu )
SetWindowCallback(@WindowCallback())
Repeat
   Event=WaitWindowEvent(1)
until Event=#PB_Event_CloseWindow
End


;-Procedures Zone
; *****************************************************************************************
; *****************************************************************************************
Procedure WindowCallback(WindowID,message,wParam,lParam)
   ; By Dobro (Apres moultes recheches, et recuperation de portion de codes Par-ci Par-là ;)
   ; Detection Periph
   res=#PB_ProcessPureBasicEvents
   Select message
      Case #WM_DEVICECHANGE
      Select wParam
         Case #DBT_DEVNODES_CHANGED  ;A device has been added to or removed from the system.
         debug "modification  Periph "
         Case #DBT_DEVICEREMOVECOMPLETE
         debug " Periph Retiré"
         Case #DBT_DEVICEARRIVAL
         Debug "Nouveau Periph Actif !! "
         Debug "*********** La Liste ************ "
         list()
         Foreach Drive.s()
            Debug "Drive :-->"+stringfield( Drive.s(),1," " )+" de Type :-->"+stringfield( Drive.s(),3," " )+" avec le Label :-->"+stringfield( Drive.s(),2," **" )
         Next
         Debug "******************************* "
      EndSelect
   EndSelect
   ProcedureReturn res
EndProcedure
Procedure.s list()
   ; By Ejan , modified By Dobro
   #DRIVE_UNKNOWN = 0
   #DRIVE_NO_ROOT_DIR = 1
   #DRIVE_REMOVABLE = 2
   #DRIVE_FIXED = 3
   #DRIVE_REMOTE = 4
   #DRIVE_CDROM = 5
   #DRIVE_RAMDISK = 6
   bits32.l = GetLogicalDrives_()
   on.l = 1
   drive$ = ""
   
   For ckBit = 0 To 31
      drive$ = ""
      If bits32 & on << ckBit
         drive$ = Chr(65 + ckBit) + ":\"
         driveType = GetDriveType_(@drive$)
         CDP$=drive$
         Select driveType
            Case #DRIVE_UNKNOWN
            VolumeName$=Space(15):Str$ = Space(32)
            GetVolumeInformation_(CDP$,@VolumeName$,Len(VolumeName$),0,0,0,@Str$,Len(Str$))
            AddElement(Drive.s())
            Drive.s()=drive$ + " Unknown_drive_type"+" **"+VolumeName$
            Case #DRIVE_NO_ROOT_DIR
            VolumeName$=Space(15):Str$ = Space(32)
            GetVolumeInformation_(CDP$,@VolumeName$,Len(VolumeName$),0,0,0,@Str$,Len(Str$))
            AddElement(Drive.s())
            Drive.s()=drive$ + "  Drive_has_no_root_dir"+" **"+VolumeName$
            Case #DRIVE_REMOVABLE
            VolumeName$=Space(15):Str$ = Space(32)
            GetVolumeInformation_(CDP$,@VolumeName$,Len(VolumeName$),0,0,0,@Str$,Len(Str$))
            AddElement(Drive.s())
            Drive.s()=drive$ + "  Removable_media_drive"+" **"+VolumeName$
            Case #DRIVE_FIXED
            VolumeName$=Space(15):Str$ = Space(32)
            GetVolumeInformation_(CDP$,@VolumeName$,Len(VolumeName$),0,0,0,@Str$,Len(Str$))
            AddElement(Drive.s())
            Drive.s()=drive$ + "  Fixed_disk_drive"+" **"+VolumeName$
            Case #DRIVE_REMOTE
            VolumeName$=Space(15):Str$ = Space(32)
            GetVolumeInformation_(CDP$,@VolumeName$,Len(VolumeName$),0,0,0,@Str$,Len(Str$))
            AddElement(Drive.s())
            Drive.s()=drive$ + "  Remote_drive"+" **"+VolumeName$
            Case #DRIVE_CDROM
            VolumeName$=Space(15):Str$ = Space(32)
            GetVolumeInformation_(CDP$,@VolumeName$,Len(VolumeName$),0,0,0,@Str$,Len(Str$))
            AddElement(Drive.s())
            Drive.s()=drive$ + "  CDROM_drive"+" **"+VolumeName$
            Case #DRIVE_RAMDISK
            VolumeName$=Space(15):Str$ = Space(32)
            GetVolumeInformation_(CDP$,@VolumeName$,Len(VolumeName$),0,0,0,@Str$,Len(Str$))
            AddElement(Drive.s())
            Drive.s()=drive$ + "  Ramdisk"+" **"+VolumeName$
         EndSelect
      EndIf
   Next
   VolumeName$="";
EndProcedure
; Epb

Répondre