[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 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

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

#1

Message par franco »

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 19:51, modifié 1 fois.
L'entraide, c'est mon dada ;)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17: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 »

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 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

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

#3

Message par franco »

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 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

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

#4

Message par franco »

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 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

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

#5

Message par franco »

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