[R] Désactiver un périphérique sans avoir besoin de redémarrer (DevCon)

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
franco
Niveau 6
Niveau 6
Messages : 257
Enregistré le : lun. 03 oct. 2011 21:37
Localisation : Liévin
Contact :
Status : Hors ligne

[R] Désactiver un périphérique sans avoir besoin de redémarrer (DevCon)  

#1

Message par franco » lun. 17 avr. 2017 14:58

Bonjour.

Tout d'abord, situons le contexte : je cherche à désactiver (et réactiver) la webcam sur mon PC. Mes nièces m'énervent à lancer skype et la webcam :P

Mais ça, c'est déjà fait. ^^


Le souci n'est pas un problème, mais une gêne...
En effet : obligation de redémarrer le PC pour que cette modification soit prise en compte...

Existe-t-il un moyen d'actualiser le PC sans avoir besoin de redémarrer le tout ?


PS : voici le code :
#include <Process.au3>
#include <Webcam.au3>
#include <File.au3>

Global $Form1 = GUICreate("Form1", 640, 525, 320, 10, $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN)

$wkdir = @TempDir & "\MaCamera"
DirRemove($wkdir, 1)
DirCreate($wkdir)

$webcam_io = $wkdir & "\WebCam_IO.exe"
FileInstall("WebCam_IO.exe", $webcam_io)

$devcon_x86 = $wkdir & "\devcon_x86.exe"
$devcon_x64 = $wkdir & "\devcon_x64.exe"
$devcon_ia64 = $wkdir & "\devcon_ia64.exe"
FileInstall("devcon_x86.exe", $devcon_x86)
FileInstall("devcon_x64.exe", $devcon_x64)
FileInstall("devcon_ia64.exe", $devcon_ia64)



Global $camera = _WebcamOpen($Form1, 0, 0, 640, 480)

$SnapBtn = GUICtrlCreateButton("Capture Image", 10, 490, 110, 25)
$VidBtn = GUICtrlCreateButton("Capture Vidéo", 130, 490, 110, 25)
$OffCam = GUICtrlCreateButton("Désactiver Caméra", 290, 490, 110, 25)
$OnCam = GUICtrlCreateButton("Activer Caméra", 410, 490, 110, 25)
$Red = GUICtrlCreateButton("-", 560, 490, 30, 25)
$Quit = GUICtrlCreateButton("X", 600, 490, 30, 25)


GUISetState(@SW_SHOW)



While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        _WebcamClose($camera)
                        Exit


                Case $SnapBtn
; je préfère ne pas mettre ce bout de code, pour éviter que certains s'en servent pour espionner...

                Case $OffCam
                        ProcessClose("devcon.exe")
                        ProcessClose("devcon_x86.exe")
                        ProcessClose("devcon_x64.exe")
                        ProcessClose("devcon_ia64.exe")
                        If @OSArch = "X86" Then $devcon = $devcon_x86
                        If @OSArch = "X64" Then $devcon = $devcon_x64
                        If @OSArch = "IA64" Then $devcon = $devcon_ia64
                        $Bat = $wkdir & "\batch.bat"
                        $ListePeriph = @HomeDrive & "\ListePeriph.txt"
                        FileDelete($Bat)
                        FileDelete($ListePeriph)
                        $tmpBAT = FileOpen($Bat, 2)
                        $command = $devcon & ' find * > ' & $ListePeriph
                        FileWriteLine($tmpBAT, $command)
                        FileClose($tmpBAT)
                        RunWait($Bat, "", @SW_HIDE)
                        For $a = _FileCountLines($ListePeriph) To 1 Step -1
                                If Not StringInStr(FileReadLine($ListePeriph, $a), "webcam") Then _FileWriteToLine($ListePeriph, $a, "", 1)
                        Next
                        $webcam_ligne = StringSplit(StringStripWS(FileReadLine($ListePeriph, 1), 8), ":")[1]
                        $webcam_id = "*" & StringReplace(StringSplit($webcam_ligne, "\")[1] & "\" & StringSplit($webcam_ligne, "\")[2], "&", "*") & "*"

                        $command = $devcon & ' disable ' & $webcam_id
                        RunWait(@ComSpec & " /c " & $command, "", @SW_HIDE)
                        MsgBox(0, "", "La désactivation de la Webcam sera effective au prochain (re)démarrage de Windows." & @CRLF & @CRLF & "Appuyez sur OK pour fermer ce message.")




                Case $OnCam
                        ProcessClose("devcon.exe")
                        ProcessClose("devcon_x86.exe")
                        ProcessClose("devcon_x64.exe")
                        ProcessClose("devcon_ia64.exe")
                        If @OSArch = "X86" Then $devcon = $devcon_x86
                        If @OSArch = "X64" Then $devcon = $devcon_x64
                        If @OSArch = "IA64" Then $devcon = $devcon_ia64
                        $Bat = $wkdir & "\batch.bat"
                        $ListePeriph = @HomeDrive & "\ListePeriph.txt"
                        FileDelete($Bat)
                        FileDelete($ListePeriph)
                        $tmpBAT = FileOpen($Bat, 2)
                        $command = $devcon & ' find * > ' & $ListePeriph
                        FileWriteLine($tmpBAT, $command)
                        FileClose($tmpBAT)
                        RunWait($Bat, "", @SW_HIDE)
                        For $a = _FileCountLines($ListePeriph) To 1 Step -1
                                If Not StringInStr(FileReadLine($ListePeriph, $a), "webcam") Then _FileWriteToLine($ListePeriph, $a, "", 1)
                        Next
                        $webcam_ligne = StringSplit(StringStripWS(FileReadLine($ListePeriph, 1), 8), ":")[1]
                        $webcam_id = "*" & StringReplace(StringSplit($webcam_ligne, "\")[1] & "\" & StringSplit($webcam_ligne, "\")[2], "&", "*") & "*"

                        $command = $devcon & ' enable ' & $webcam_id
                        RunWait(@ComSpec & " /c " & $command, "", @SW_HIDE)
                        MsgBox(0, "", "L'activation de la Webcam sera effective au prochain (re)démarrage de Windows." & @CRLF & @CRLF & "Appuyez sur OK pour fermer ce message.")


        EndSwitch
WEnd

PS : envUpdate ne fonctionne pas je pense : je vais essayer...

Merci à tous... ;)


++
Modifié en dernier par franco le jeu. 20 avr. 2017 18:51, modifié 1 fois.
L'entraide, c'est mon dada ;)

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5594
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Désactiver un périphérique sans avoir besoin de redémarrer (DevCon)

#2

Message par mikell » mer. 19 avr. 2017 20:49

Tu pourrais essayer d'exécuter la commande restart juste après le disable

Code : Tout sélectionner

devcon.exe disable "periph"
devcon.exe restart "periph"
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
franco
Niveau 6
Niveau 6
Messages : 257
Enregistré le : lun. 03 oct. 2011 21:37
Localisation : Liévin
Contact :
Status : Hors ligne

Re: [..] Désactiver un périphérique sans avoir besoin de redémarrer (DevCon)

#3

Message par franco » mer. 19 avr. 2017 21:32

Salut.

Et merci pour ta réponse. ;)

J'ai tenté... J'ai mis une 'pause' et j'ai affiché la fenêtre CMD.

J'obtiens ceci :
USB\VID_064E&PID_9809&MI_00\7&285DACA6&0&0000 : Requires reboot
The 1 device(s) are ready to be restarted. To restart the devices, reboot the system.
Appuyez sur une touche pour continuer...
Du coup, le redémarrage est requis...

Ce qui peut sembler dire qu'il n'y a aucun moyen d'y échapper... Si c'est vraiment le cas, tant pis.

J'ai même tenté un devcon update... Car comme un novice, j'ai pensé que cela signifiait : mettre le statut à jour de la webcam.
En fait, cela concerne les pilotes. :lol:



++
L'entraide, c'est mon dada ;)

Avatar du membre
franco
Niveau 6
Niveau 6
Messages : 257
Enregistré le : lun. 03 oct. 2011 21:37
Localisation : Liévin
Contact :
Status : Hors ligne

Re: [..] Désactiver un périphérique sans avoir besoin de redémarrer (DevCon)

#4

Message par franco » jeu. 20 avr. 2017 18:50

Bonsoir.

J'ai tenté une autre approche...

Au lieu d'afficher directement la caméra avec les différents boutons, j'ai décidé :
- D'afficher la caméra si si on appuie sur le bouton : Visualiser la webcam
- De désactiver la webcam si on appuie sur le bouton : Désactiver la webcam
- D'activer la webcam si on appuie sur le bouton : Activer la webcam

Et bien, si je décide d'afficher la webcam, de fermer la fenêtre, de la désactiver pour ensuite l'afficher à nouveau : elle est bien désactivée...
Et si je recommence en l'activant cette fois-ci puis en l'affichant de nouveau : ça fonctionne...


Donc, je pense que le souci venait en fait de l'affichage directe de la webcam : déjà utilisée, donc il ne pouvait rien faire, donc redémarrage requis...



Le souci est donc résolu.


Le code simplifié :
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Process.au3>
#include <Webcam.au3>
#include <File.au3>

Global $camera, $devcon

$wkdir = @TempDir & "\MaCamera"
DirRemove($wkdir, 1)
DirCreate($wkdir)

$webcam_io = $wkdir & "\WebCam_IO.exe"
FileInstall("WebCam_IO.exe", $webcam_io)

$devcon_x86 = $wkdir & "\devcon_x86.exe"
$devcon_x64 = $wkdir & "\devcon_x64.exe"
$devcon_ia64 = $wkdir & "\devcon_ia64.exe"
FileInstall("devcon_x86.exe", $devcon_x86)
FileInstall("devcon_x64.exe", $devcon_x64)
FileInstall("devcon_ia64.exe", $devcon_ia64)

Global $VisuCam = GUICreate("VisuCam", 615, 437, 192, 124)

Global $vCam = GUICtrlCreateButton("Visualiser la webcam", 5, 10, 120, 25)
GUICtrlSetCursor(-1, 3)
Global $offCam = GUICtrlCreateButton("Désactiver la webcam", 130, 10, 120, 25)
GUICtrlSetCursor(-1, 3)
Global $onCam = GUICtrlCreateButton("Activer la webcam", 255, 10, 120, 25)
GUICtrlSetCursor(-1, 3)

Global $Reduire = GUICtrlCreateButton("-", 385, 10, 25, 25)
GUICtrlSetCursor(-1, 0)
Global $Reduire = GUICtrlCreateButton("-", 415, 10, 25, 25)
GUICtrlSetCursor(-1, 0)




GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        DirRemove($wkdir, 1)
                        Exit

                Case $vCam
                        _PrevCam()

                Case $offCam
                        $webcam_id = _WebcamID()
                        $command = $devcon & ' disable ' & $webcam_id
                        RunWait(@ComSpec & " /c " & $command, "", @SW_HIDE)

                Case $onCam
                        $webcam_id = _WebcamID()
                        $command = $devcon & ' enable ' & $webcam_id
                        RunWait(@ComSpec & " /c " & $command, "", @SW_HIDE)



        EndSwitch
WEnd


Func _PrevCam()

        Global $Form1 = GUICreate("Form1", 640, 525, 320, 10, $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN)
        GUISetFont(8.5, 400, 0, "comic sans ms")

        GUISetState(@SW_SHOW)
        Global $camera = _WebcamOpen($Form1, 0, 0, 640, 480)

        While 1
                $nMsg = GUIGetMsg()
                Switch $nMsg
                        Case $GUI_EVENT_CLOSE
                                GUIDelete($Form1)
                                ExitLoop


                EndSwitch
        WEnd



EndFunc   ;==>_PrevCam


Func _WebcamID()
        ProcessClose("devcon.exe")
        ProcessClose("devcon_x86.exe")
        ProcessClose("devcon_x64.exe")
        ProcessClose("devcon_ia64.exe")
        If @OSArch = "X86" Then $devcon = $devcon_x86
        If @OSArch = "X64" Then $devcon = $devcon_x64
        If @OSArch = "IA64" Then $devcon = $devcon_ia64
        $Bat = $wkdir & "\batch.bat"
        $ListePeriph = @HomeDrive & "\ListePeriph.txt"
        FileDelete($Bat)
        FileDelete($ListePeriph)
        $tmpBAT = FileOpen($Bat, 2)
        $command = $devcon & ' find * > ' & $ListePeriph
        FileWriteLine($tmpBAT, $command)
        FileClose($tmpBAT)
        RunWait($Bat, "", @SW_HIDE)
        For $a = _FileCountLines($ListePeriph) To 1 Step -1
                If Not StringInStr(FileReadLine($ListePeriph, $a), "webcam") Then _FileWriteToLine($ListePeriph, $a, "", 1)
        Next
        $webcam_ligne = StringSplit(StringStripWS(FileReadLine($ListePeriph, 1), 8), ":")[1]
        $webcam_id = "*" & StringReplace(StringSplit($webcam_ligne, "\")[1] & "\" & StringSplit($webcam_ligne, "\")[2], "&", "*") & "*"
        Return SetExtended(1, $webcam_id)
EndFunc   ;==>_WebcamID
 

++
L'entraide, c'est mon dada ;)

Avatar du membre
franco
Niveau 6
Niveau 6
Messages : 257
Enregistré le : lun. 03 oct. 2011 21:37
Localisation : Liévin
Contact :
Status : Hors ligne

Re: [R] Désactiver un périphérique sans avoir besoin de redémarrer (DevCon)

#5

Message par franco » ven. 21 avr. 2017 12:44

Lu'

C'est encore moi.

Maintenant que le scrit fonctionne, je tiens à désactiver certains boutons quand la webcam est désactivée.

Ne trouvant pas comment faire via l'UDF webcam, j'ai procédé autrement.


En effet, quand on veut visualiser la webcam, si elle est désactivée : ca fait un carré noir avec comme résolution : 640*480.


J'ai donc utilisé la commande PixelGetColor pour récupérer la couleur du pixel :
- En haut à gauche
- En haut à droite
- En bas à gauche
- En bas à droite

Comme ceci :
Func _CheckCam()
        $couleurPX = ""
        $couleurPX &= PixelGetColor(321, 11, $PrevCamGui) ; haut-gauche
        $couleurPX &= PixelGetColor(959, 11, $PrevCamGui) ; haut-droit
        $couleurPX &= PixelGetColor(321, 479, $PrevCamGui) ; bas-gauche
        $couleurPX &= PixelGetColor(959, 479, $PrevCamGui) ; bas-droit
        Return SetExtended(1, $couleurPX)
EndFunc   ;==>_CheckCam
Et de ce fait, si _CheckCam me renvoit 0000 : la webcam est désactivée.


Ca fonctionne.

Mais la question que je me pose : est-ce une bonne méthode ? Et/ou existe-t-il une autre ?


@+ et merci. :)
L'entraide, c'est mon dada ;)

Répondre

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité