Page 1 sur 1

Detecter le branchement d'un media USB

Publié : ven. 18/juil./2014 14:58
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

Re: Detecter le branchement d'un media USB

Publié : ven. 18/juil./2014 20:03
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 :)

Re: Detecter le branchement d'un media USB

Publié : ven. 18/juil./2014 20:34
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

Re: Detecter le branchement d'un media USB

Publié : ven. 18/juil./2014 20:57
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() 

Re: Detecter le branchement d'un media USB

Publié : ven. 18/juil./2014 21:01
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

Re: Detecter le branchement d'un media USB

Publié : ven. 18/juil./2014 22:22
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


Re: Detecter le branchement d'un media USB

Publié : ven. 18/juil./2014 23:05
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

Re: Detecter le branchement d'un media USB

Publié : ven. 18/juil./2014 23:10
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

Re: Detecter le branchement d'un media USB

Publié : sam. 19/juil./2014 1:24
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

Re: Detecter le branchement d'un media USB

Publié : sam. 19/juil./2014 7:02
par Backup
.......... voir plus bas

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

Publié : sam. 19/juil./2014 7:02
par doudouvs
Merci pour vos sources c'est nickel

@Dobro exactement ce que je chercher, bon la c'est du tout cuit :)

Re: Detecter le branchement d'un media USB

Publié : sam. 19/juil./2014 9:35
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

Re: Detecter le branchement d'un media USB

Publié : sam. 19/juil./2014 12:13
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