[R] Détecter insertion usb

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
quelqun
Niveau 4
Niveau 4
Messages : 66
Enregistré le : sam. 08 janv. 2011 23:56
Status : Hors ligne

[R] Détecter insertion usb

#1

Message 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
Modifié en dernier par quelqun le lun. 07 mars 2011 12:53, modifié 1 fois.
Avatar du membre
BlueCore
Niveau 4
Niveau 4
Messages : 73
Enregistré le : sam. 04 sept. 2010 09:55
Status : Hors ligne

Re: [..] Détecter insertion usb

#2

Message 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
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Détecter insertion usb

#3

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Détecter insertion usb

#4

Message 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


 
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Détecter insertion usb

#5

Message 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. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
quelqun
Niveau 4
Niveau 4
Messages : 66
Enregistré le : sam. 08 janv. 2011 23:56
Status : Hors ligne

Re: [..] Détecter insertion usb

#6

Message par quelqun »

@BlueCore: ton code est bien mais j'ai beau regarder je comprend pas trop pourquoi mettre des boucles for ?

merci
quelqun
Niveau 4
Niveau 4
Messages : 66
Enregistré le : sam. 08 janv. 2011 23:56
Status : Hors ligne

Re: [..] Détecter insertion usb

#7

Message par quelqun »

up
Avatar du membre
BlueCore
Niveau 4
Niveau 4
Messages : 73
Enregistré le : sam. 04 sept. 2010 09:55
Status : Hors ligne

Re: [..] Détecter insertion usb

#8

Message par BlueCore »

en fait, le For sers juste à vérifier un à un les valeurs de l'array des drives
quelqun
Niveau 4
Niveau 4
Messages : 66
Enregistré le : sam. 08 janv. 2011 23:56
Status : Hors ligne

Re: [..] Détecter insertion usb

#9

Message 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
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Détecter insertion usb

#10

Message 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)
Si vis pacem para bellum
quelqun
Niveau 4
Niveau 4
Messages : 66
Enregistré le : sam. 08 janv. 2011 23:56
Status : Hors ligne

Re: [..] Détecter insertion usb

#11

Message 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
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Détecter insertion usb

#12

Message 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...
Si vis pacem para bellum
quelqun
Niveau 4
Niveau 4
Messages : 66
Enregistré le : sam. 08 janv. 2011 23:56
Status : Hors ligne

Re: [..] Détecter insertion usb

#13

Message 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.
Avatar du membre
BlueCore
Niveau 4
Niveau 4
Messages : 73
Enregistré le : sam. 04 sept. 2010 09:55
Status : Hors ligne

Re: [..] Détecter insertion usb

#14

Message par BlueCore »

boah tant que ça marche.. (demandez à Tlem, le big master du forum)
quelqun
Niveau 4
Niveau 4
Messages : 66
Enregistré le : sam. 08 janv. 2011 23:56
Status : Hors ligne

Re: [..] Détecter insertion usb

#15

Message par quelqun »

en dirait que tu as juste copier coller le code :roll:
en attente de la réponse de Tlem ...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Détecter insertion usb

#16

Message 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:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
quelqun
Niveau 4
Niveau 4
Messages : 66
Enregistré le : sam. 08 janv. 2011 23:56
Status : Hors ligne

Re: [..] Détecter insertion usb

#17

Message 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
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Détecter insertion usb

#18

Message par Tlem »

quelqun a écrit :vous m'avez pas répondu :?
:shock:
Ha ! Mais quelle est donc la question exacte ?
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
quelqun
Niveau 4
Niveau 4
Messages : 66
Enregistré le : sam. 08 janv. 2011 23:56
Status : Hors ligne

Re: [..] Détecter insertion usb

#19

Message 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 ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11818
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Détecter insertion usb

#20

Message 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:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre