Detecter le branchement d'un media USB
-
- Messages : 244
- Inscription : jeu. 07/mars/2013 19:02
- Localisation : France Alsace / Espagne Girona
Detecter le branchement d'un media USB
Bonjour,
Je cherche sous windows comment détecter le branchement d'un media USB clé/hdd ect...
Si vous avez une piste
Merci
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
Re: Detecter le branchement d'un media USB
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
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

-
- Messages : 244
- Inscription : jeu. 07/mars/2013 19:02
- Localisation : France Alsace / Espagne Girona
Re: Detecter le branchement d'un media USB
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
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
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Detecter le branchement d'un media USB
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Detecter le branchement d'un media USB
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.
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
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
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)
Re: Detecter le branchement d'un media USB
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
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
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Detecter le branchement d'un media USB
Tu as raison je le suis tromper de code.Dobro a écrit :le Code que Falsam propose, ne sert qu'a lister si un peripherique est Removable
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Detecter le branchement d'un media USB
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

perso mes infos , je les tires d'ici :
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Re: Detecter le branchement d'un media USB
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
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)
Re: Detecter le branchement d'un media USB
.......... voir plus bas
Dernière modification par Backup le sam. 19/juil./2014 12:08, modifié 1 fois.
-
- Messages : 244
- Inscription : jeu. 07/mars/2013 19:02
- Localisation : France Alsace / Espagne Girona
[resolu] - Detecter le branchement d'un media USB
Merci pour vos sources c'est nickel
@Dobro exactement ce que je chercher, bon la c'est du tout cuit
@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
Re: Detecter le branchement d'un media USB
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 :
Pour ma propre compréhension, je ne comprend le code a partir de :
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
Déjà merci "Dobro" pour ce code, mais (y en a toujours

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
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)
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)
Re: Detecter le branchement d'un media USB
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 "
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 :

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