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

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

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. :P
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 :

Code : Tout sélectionner

For $i = 1 To $Old_Drives[0]
est ce que la variable i sera incrementer jusqu'a 2? et pourquoi ? puisque c'est

Code : Tout sélectionner

For $i = 1 To 1
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

Code : Tout sélectionner

for $i = 1 to 1
maintenant immagine que tu as partitionné ton périphérique usb et qu'il contient 2 ou 3 lecteurs, ca fera

Code : Tout sélectionner

for $i = 1 to 2 (ou 3)

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

Code : Tout sélectionner

for $i = 1 to 1
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:

Code : Tout sélectionner

for $i = 1 to 1
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

Code : Tout sélectionner

for $i = 1 to 1
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 :roll:
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. :roll:

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. :roll:

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 :?
:shock:
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: