Page 1 sur 2
[R] Détecter insertion usb
Posté : lun. 21 févr. 2011 12:40
par quelqun
salut

j'aimerais savoir comment détecter l'insertion d'une clef usb (avoir la lettre de la clef).
j'ai vu ce script mais il n'a pas l'air de marcher (a l'insertion de ma clef rien ne ce passe)
j'aimerais faire un script qui me met un message "clef usb [lettre de la clef] brancher" chaque fois qu'il y a une clef qui se branche.
merci
Re: [..] Détecter insertion usb
Posté : lun. 21 févr. 2011 13:48
par BlueCore
salut quelqun ! (déjà, c'est quelqu'un)
tout d'abord, il faut que tu fasse une boucle qui vérifira toutes les 500ms qu'aucun périphérique n'ai été inséré où retiré.
s'il y à une modification des périphériques, tu n'as qu'à afficher ce qui à changé.
je te fait un petit code dans quelques minutes
voilà :
► Afficher le textevoir le code
Code : Tout sélectionner
$Drives = DriveGetDrive("REMOVABLE")
$Old_Drives = DriveGetDrive("REMOVABLE")
While 1
$Drives = DriveGetDrive("REMOVABLE")
If $Drives[0] <> $Old_Drives[0] Then
If $Drives[0] > $Old_Drives[0] Then ;Périphérique Ajouté
For $i = 1 To $Old_Drives[0]
If $Drives[$i] <> $Old_Drives[$i] Then ExitLoop
Next
ToolTip("Clé USB " & $Drives[$i] & " branchée.", 10, 10, "Information", 1)
Else ;Périphérique Retiré
For $i = 1 To $Drives[0]
If $Old_Drives[$i] <> $Drives[$i] Then ExitLoop
Next
ToolTip("Clé USB " & $Old_Drives[$i] & " débranchée.", 10, 10, "Information", 1)
EndIf
$Old_Drives = $Drives
EndIf
Sleep(500)
WEnd
Re: [..] Détecter insertion usb
Posté : lun. 21 févr. 2011 22:38
par Tlem
Pour un de mes projets en cours, j'avais essayé cette méthode, mais elle présentait certains inconvénient et ne m'avais pas vraiment satisfait pour je ne sais plus quelle raison.
Après pas mal de recherches, j'ai finalement réussit à trouvé mon bonheur avec ce bout de code :
► Afficher le texte
Code : Tout sélectionner
$strComputer = "."
$objWMIServices = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$sink = ObjCreate("WbemScripting.SWbemSink")
ObjEvent($sink, "SINK_")
$objWMIServices.ExecNotificationQueryAsync($sink, "SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & "TargetInstance ISA 'Win32_LogicalDisk'")
While 1
Sleep(250)
WEnd
Exit
Func SINK_OnObjectReady($objObject, $objAsyncContext)
If $objObject.TargetInstance.DriveType = 2 Then
Select
Case $objObject.Path_.Class() = "__InstanceCreationEvent"
Local $DriveIn = $objObject.TargetInstance.DeviceId
ConsoleWrite("Lecteur " & $DriveIn & " ajouté" & @CRLF)
Case $objObject.Path_.Class() = "__InstanceDeletionEvent"
Local $DriveOut = $objObject.TargetInstance.DeviceId
ConsoleWrite("Lecteur " & $DriveOut & " supprimé" & @CRLF)
EndSelect
EndIf
EndFunc ;==>SINK_OnObjectReady
Re: [..] Détecter insertion usb
Posté : mar. 22 févr. 2011 20:20
par matwachich
J'aime bien ton code Tlem!
Pourquoi ne pas en faire un petit UDF comme cela:
Code : Tout sélectionner
#include-once
Global $__USB_Detect_OnEventFunction = -1
#cs ----------
Enregistre une fonction call-back qui sera appelé à l'insertion/éjection
Elle doit avoir la forme suivante: _func($sPath, $iType)
$sPath = Chemin du disque USB inséré/éjecté (exemple: "F:")
$iType = 1 Pour Insertion, = 0 Pour Ejection
Exemple
_USB_OnEventRegister("_maFonction")
While 1
Sleep(250)
WEnd
Func _maFonction($disk, $type)
Switch $type
Case 1
ConsoleWrite("Disque " & $disk & " inséré" & @CRLF)
Case 0
ConsoleWrite("Disque " & $disk & " retiré" & @CRLF)
EndSwitch
EndFunc
#ce ----------
Func _USB_OnEventRegister($sFunc)
; If already registered
If $__USB_Detect_OnEventFunction <> -1 Then Return SetError(1, 0, 0)
Local $strComputer = "."
Local $objWMIServices = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
Local $sink = ObjCreate("WbemScripting.SWbemSink")
ObjEvent($sink, "__SINK_")
$objWMIServices.ExecNotificationQueryAsync($sink, "SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_LogicalDisk'")
$__USB_Detect_OnEventFunction = $sFunc
Return 1
EndFunc
Func _USB_OnEventUnRegister()
$__USB_Detect_OnEventFunction = -1
EndFunc
Func __SINK_OnObjectReady($objObject, $objAsyncContext)
If $objObject.TargetInstance.DriveType = 2 Then
Select
Case $objObject.Path_.Class() = "__InstanceCreationEvent"
Local $DriveIn = $objObject.TargetInstance.DeviceId
; ConsoleWrite("Lecteur " & $DriveIn & " ajouté" & @CRLF)
Call($__USB_Detect_OnEventFunction, $DriveIn, 1)
Case $objObject.Path_.Class() = "__InstanceDeletionEvent"
Local $DriveOut = $objObject.TargetInstance.DeviceId
;ConsoleWrite("Lecteur " & $DriveOut & " supprimé" & @CRLF)
Call($__USB_Detect_OnEventFunction, $DriveOut, 0)
EndSelect
EndIf
EndFunc ;==>SINK_OnObjectReady
Re: [..] Détecter insertion usb
Posté : mar. 22 févr. 2011 21:09
par Tlem
Disons simplement, que j'ai sortit le code de son contexte, car en réalité c'est une partie d'un projet en cours.
J'aime bien votre idée de fonction, donc comme vous vous proposez gentiment, il ne vous reste plus qu'à rajouter ce code dans la section
Fonctions et UDF.
Je ne doute pas que vous ferez cela très bien. ^^
Re: [..] Détecter insertion usb
Posté : lun. 28 févr. 2011 11:57
par quelqun
@BlueCore: ton code est bien mais j'ai beau regarder je comprend pas trop pourquoi mettre des boucles for ?
merci
Re: [..] Détecter insertion usb
Posté : mar. 01 mars 2011 18:32
par quelqun
up
Re: [..] Détecter insertion usb
Posté : mar. 01 mars 2011 21:39
par BlueCore
en fait, le For sers juste à vérifier un à un les valeurs de l'array des drives
Re: [..] Détecter insertion usb
Posté : mer. 02 mars 2011 11:54
par quelqun
je ne comprend pas cet partie:
Code : Tout sélectionner
$Drives = DriveGetDrive("REMOVABLE")
$Old_Drives = DriveGetDrive("REMOVABLE")
;ici $Drives=$Old_Drives
While 1
$Drives = DriveGetDrive("REMOVABLE")
If $Drives[0] <> $Old_Drives[0] Then
If $Drives[0] > $Old_Drives[0] Then ;Périphérique Ajouté
For $i = 1 To $Old_Drives[0] ; ce qui veut dire: For $i = 1 To 1
If $Drives[$i] <> $Old_Drives[$i] Then ExitLoop
Next
ToolTip("Clé USB " & $Drives[$i] & " branchée.", 10, 10, "Information", 1)
ce que je comprend pas c'est la ligne oû il y a :
est ce que la variable i sera incrementer jusqu'a 2? et pourquoi ? puisque c'est
merci
Re: [..] Détecter insertion usb
Posté : mer. 02 mars 2011 12:11
par zeshrek
toi tu as oublié les 2 'if' qui précèdent !
le premier sert a vérifier que le nouveau nombre de lecteur est différent de l'ancien (preuve qu'un disque a été ajouté ou enlevé)
le second que le nouveau nombre est bien suppérieur a l'ancien et donc qu'il y eu ajout et non retrait (comme indiqué dans le commentaire juste apres le 'then')
donc si avant tu avais 0 disques amovibles et que maintenant tu en as 1 ca fera effectivement
maintenant immagine que tu as partitionné ton périphérique usb et qu'il contient 2 ou 3 lecteurs, ca fera
Re: [..] Détecter insertion usb
Posté : mer. 02 mars 2011 12:56
par quelqun
zeshrek a écrit :
donc si avant tu avais 0 disques amovibles et que maintenant tu en as 1 ca fera effectivement
juste la fonction DriveGetDrive("REMOVABLE") sa me renvoi toujours "1" (Disquette 3½ A:) et si je branche la clef sa va renvoyer 2 mais dans le code on compare avec $Old_Drives qui vaut toujours 1 alors sa doit être:
pouquoi la variable i est incrémenter a la fin de
Code : Tout sélectionner
For $i = 1 To $Old_Drives[0] ; ce qui veut dire: For $i = 1 To 1
If $Drives[$i] <> $Old_Drives[$i] Then ExitLoop ;if "a:" <> "a:" Then ExitLoop
Next
?
puisque c'est
alors je pense qu'elle doit toujours conserver la valeur 1.
merci
Re: [..] Détecter insertion usb
Posté : mer. 02 mars 2011 13:01
par zeshrek
mea culpa
effectivement le for est basé sur $old_drive, du coup soit tu as raison, soit il y a une subtilité qui nous échape...
Re: [..] Détecter insertion usb
Posté : mer. 02 mars 2011 13:18
par quelqun
c'est ce que je comprend pas. je pense qu'il faut demander a BlueCore l'auteur du code

en attendant sa réponse.
Re: [..] Détecter insertion usb
Posté : mer. 02 mars 2011 17:31
par BlueCore
boah tant que ça marche.. (demandez à Tlem, le big master du forum)
Re: [..] Détecter insertion usb
Posté : mer. 02 mars 2011 17:42
par quelqun
en dirait que tu as juste copier coller le code
en attente de la réponse de Tlem ...
Re: [..] Détecter insertion usb
Posté : mer. 02 mars 2011 23:36
par Tlem
Ha !!! Je doit donner une réponse ...
Hé bien, pour moi, le code de BlueCore à l'air de fonctionner tel qu'il est, mais si on doit l'intégrer dans un code plus complexe, alors les choses deviennent un peut plus compliquées.
Le code que j'ai proposé semble plus complexe, mais au moins, on peut l'intégrer facilement dans un projet plus élaboré.
Donc chacun est libre d'utiliser le code qu'il veut.

Re: [..] Détecter insertion usb
Posté : jeu. 03 mars 2011 19:35
par quelqun
je voulais savoir parce que coller une partie du code et l'intégrer dans mon programme sans connaître le fonctionnement je saurais pas comment il va agire
Tlem a écrit :Donc chacun est libre d'utiliser le code qu'il veut.

vous m'avez pas répondu
merci
Re: [..] Détecter insertion usb
Posté : jeu. 03 mars 2011 23:44
par Tlem
quelqun a écrit :vous m'avez pas répondu

Ha ! Mais quelle est donc la question exacte ?
Re: [..] Détecter insertion usb
Posté : ven. 04 mars 2011 19:53
par quelqun
dans le code de BlueCore :
Code : Tout sélectionner
$Drives = DriveGetDrive("REMOVABLE")
$Old_Drives = DriveGetDrive("REMOVABLE")
While 1
$Drives = DriveGetDrive("REMOVABLE")
If $Drives[0] <> $Old_Drives[0] Then
If $Drives[0] > $Old_Drives[0] Then ;Périphérique Ajouté
For $i = 1 To $Old_Drives[0]
If $Drives[$i] <> $Old_Drives[$i] Then ExitLoop
Next
ToolTip("Clé USB " & $Drives[$i] & " branchée.", 10, 10, "Information", 1)
Endif
EndIf
Sleep(500)
WEnd
plus précisement dans la partie:
Code : Tout sélectionner
For $i = 1 To $Old_Drives[0]
If $Drives[$i] <> $Old_Drives[$i] Then ExitLoop
Next
dans mon ordinateur la fonction $Drives=DriveGetDrive("REMOVABLE") renvoi: $Drives[0]==1 et $Drives[1]=="a:" (Disquette 3½ A:) alors si un périphérique et ajouter c'est ce code qui va s'éxecuter:
Code : Tout sélectionner
For $i = 1 To $Old_Drives[0] ; ce qui veut dire: For $i = 1 To 1
If $Drives[$i] <> $Old_Drives[$i] Then ExitLoop ;if "a:" <> "a:" Then ExitLoop
Next
comment ou bien pourquoi la variable i est incrémenter jusqu'a 2 ?
Re: [..] Détecter insertion usb
Posté : ven. 04 mars 2011 20:33
par Tlem
Surement par ce que
$Old_Drives contient 2 éléments.
$Old_Drives[0] = 2 (Total des éléments)
$Old_Drives[1] = a:
$Old_Drives[2] = c: