Page 1 sur 1

[Ex] Modifier la luminosité de l'écran

Posté : lun. 23 sept. 2019 20:20
par toto1515
Bonjour,
après avoir pas mal fouillé sur le web pour trouver un moyen de modifier la luminosité de l'écran de mon PC, j'ai créé ce script qui utilise "Powershell".

#cs ----------------------------------------------------------------------------
AutoIt Version : 3.3.14.5
Auteur:         François
Fonction du Script :    Modification de la luminosité de l'écran via powershell.
1- on récupère les infos du mode d'alimentation ('PowerShell.exe (Get-Ciminstance -Namespace root/WMI -ClassName WmiMonitorBrightness)')
2- on lit la valeur en cours de la luminosité (CurrentBrightness).
3- on affiche la GUI, le slider étant initié avec cette valeur .
4- lors du déplacement du slider, on récupère la valeur et on lance une commande powershell qui modifie la luminosité 'PowerShell.exe (Get-WmiObject -Namespace root/WMI -Class WmiMonitorBrightnessMethods).WmiSetBrightness(1,' & $new_val & ')'
C'est tout.
(Testé sous windows 8)
#ce ----------------------------------------------------------------------------
Opt("mustdeclarevars", 1)

#Region les constantes
   Global Const $debug = 0
   Global Const $WS_POPUP = 0x80000000
   Global Const $WS_DLGFRAME = 0x00400000
   Global Const $TBS_AUTOTICKS = 0x0001
   Global Const $TBS_VERT = 0x0002
   Global Const $TBS_BOTH = 0x0008
   Global Const $SS_CENTER = 0x01
   Global Const $SS_CENTERIMAGE = 0x0200
   Global Const $SS_SUNKEN = 0x1000
   Global Const $STDOUT_CHILD = 0x2
   Global Const $sCommand_deb = 'PowerShell.exe (Get-WmiObject -Namespace root/WMI -Class WmiMonitorBrightnessMethods).WmiSetBrightness(1,'
   Global Const $sCommand_fin = ')'
   Global Const $scommand_ini = 'PowerShell.exe (Get-Ciminstance -Namespace root/WMI -ClassName WmiMonitorBrightness)'
#EndRegion les constantes

#Region mes variables
   Global $aArray
   Global $Btn_quitter
   Global $ini_val
   Global $iPID
   Global $m_label
   Global $m_slider
   Global $ma_forme
   Global $mon_string = ""
   Global $new_val
   Global $nMsg
   Global $sCommand
   Global $sOutput
#EndRegion mes variables

#Region création de la forme
   $ma_forme = GUICreate("Brightness", 105, 485, -1, 70, BitOR($WS_DLGFRAME, $WS_POPUP))
   $m_slider = GUICtrlCreateSlider(30, 10, 40, 400, BitOR($TBS_AUTOTICKS, $TBS_VERT, $TBS_BOTH))
   GUICtrlSetLimit(-1, 100, 0)
   GUICtrlCreateLabel("100", 10, 16, 20, 20, $SS_CENTER)
   GUICtrlCreateLabel("0", 10, 390, 20, 20, $SS_CENTER)
   GUICtrlCreateLabel("100", 72, 16, 20, 20, $SS_CENTER)
   GUICtrlCreateLabel("0", 72, 390, 20, 20, $SS_CENTER)
   $m_label = GUICtrlCreateLabel("", 15, 420, 75, 20, BitOR($SS_SUNKEN, $SS_CENTERIMAGE, $SS_CENTER))
   $Btn_quitter = GUICtrlCreateButton("Quitter", 15, 450, 75, 25)
#EndRegion création de la forme

#Region programme principal
   ; on récupère les infos du mode d'alimentation
   $iPID = Run(@ComSpec & ' /C ' & $scommand_ini, '', @SW_HIDE, $STDOUT_CHILD)
   ProcessWaitClose($iPID)
   $sOutput = StdoutRead($iPID)
   If $debug = 1 Then ConsoleWrite($sOutput & @CRLF)
   $aArray = StringSplit(StringTrimRight(StringStripCR($sOutput), StringLen(@CRLF)), @CRLF)
   If @error Then
      MsgBox(0, "", "Il y a eu une erreur avec powercfg.")
      Exit
   EndIf
   ; on recherche la ligne correspondant à la luminosité
   For $i = 1 To $aArray[0]
      If StringInStr($aArray[$i], "CurrentBrightness") Then
         If $debug = 1 Then ConsoleWrite($aArray[$i] & @CRLF)
         $mon_string = $aArray[$i]
      EndIf
   Next
   If $mon_string = "" Then
      MsgBox(0, "Erreur", "La luminosité n'a pas été trouvée !!!")
      Exit
   EndIf
   $ini_val = StringRegExpReplace($mon_string, "[\s\:A-Za-z]*", "")
   If $debug = 1 Then ConsoleWrite("$ini_val=" & $ini_val & @CRLF)
   ; on affiche la forme
   GUICtrlSetData($m_label, $ini_val & " %")
   GUICtrlSetData($m_slider, 100 - $ini_val)
   GUISetState(@SW_SHOW, $ma_forme)
   While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
         Case $Btn_quitter
            Exit
         Case $m_slider
            $new_val = 100 - GUICtrlRead($m_slider)
            If $debug = 1 Then ConsoleWrite("$new_val=" & $new_val & @CRLF)
            GUICtrlSetData($m_label, $new_val & " %")
            ; on modifie la luminosité
            $sCommand = $sCommand_deb & $new_val & $sCommand_fin
            Run($sCommand, "", @SW_HIDE)
      EndSwitch
   WEnd
#EndRegion programme principal

Je précise que je suis sous windows 8.

Cordialement

Re: [Ex] Modifier la luminosité de l'écran

Posté : lun. 23 sept. 2019 21:14
par toto1515
Re bonjour,
j'ai poursuivi mes investigations et j'ai un autre script qui, cette fois, utilise 'powercfg'.

#cs ----------------------------------------------------------------------------
   AutoIt Version : 3.3.14.5
   Auteur:         François
   Fonction du Script :
   Modification de la luminosité de l'écran via powershell.
   1- on récupère les infos du mode d'alimentation ('powercfg /q')
   2- on récupère la valeur du mode, de l'affichage, de la luminosité de l'affichage, l'index de la luminosité.
   3- on affiche la GUI, le slider étant initié avec cette valeur .
   4- lors du déplacement du slider, on récupère la valeur et on lance une commande powershell qui modifie la luminosité
   'powercfg -setacvalueindex $mon_mode $mon_affichage $mon_luminosite $new_val'
   puis
   'powercfg /S $mon_mode' pour ré-activer le mode

   C'est tout.
   (Testé sous windows 8)
#ce ----------------------------------------------------------------------------
Opt("mustdeclarevars", 1)

#Region les constantes
   Global Const $debug = 1
   Global Const $WS_POPUP = 0x80000000
   Global Const $WS_DLGFRAME = 0x00400000
   Global Const $TBS_AUTOTICKS = 0x0001
   Global Const $TBS_VERT = 0x0002
   Global Const $TBS_BOTH = 0x0008
   Global Const $SS_CENTER = 0x01
   Global Const $SS_CENTERIMAGE = 0x0200
   Global Const $SS_SUNKEN = 0x1000
   Global Const $STDOUT_CHILD = 0x2
   Global Const $sCommand_deb = 'powercfg -setacvalueindex ' ;  pour le courant continu -> 'powercfg -setdcvalueindex '
   Global Const $sCommand_fin = 'powercfg /S '
   Global Const $scommand_ini = 'powercfg /q'
   Global Const $string_mode_search = "GUID du mode de gestion de l'alimentation"
   Global Const $string_affichage_search = "(Affichage)"
   Global Const $string_luminosite_search = "\(Luminosit. de l\'affichage\)"
   Global Const $string_index = "Index actuel du param.tre de courant alternatif" ; pour le courant continu -> Global Const $string_index = "Index actuel du param.tre de courant continu"
#EndRegion les constantes

#Region mes variables
   Global $aArray
   Global $Btn_quitter
   Global $i_deb = 1
   Global $ini_val = 99999
   Global $iPID
   Global $m_label
   Global $m_slider
   Global $ma_forme
   Global $mon_affichage = ""
   Global $mon_affichage_tmp = ""
   Global $mon_index_tmp = ""
   Global $mon_luminosite = ""
   Global $mon_luminosite_tmp = ""
   Global $mon_mode = ""
   Global $mon_mode_tmp = ""
   Global $mon_string_affichage = ""
   Global $mon_string_index = ""
   GLobal $mon_string_luminosite = ""
   Global $mon_string_mode = ""
   Global $new_val
   Global $nMsg
   Global $sCommand
   Global $sOutput
#EndRegion mes variables

#Region création de la forme
   $ma_forme = GUICreate("Brightness", 105, 485, -1, 70, BitOR($WS_DLGFRAME, $WS_POPUP))
   $m_slider = GUICtrlCreateSlider(30, 10, 40, 400, BitOR($TBS_AUTOTICKS, $TBS_VERT, $TBS_BOTH))
   GUICtrlSetLimit(-1, 100, 0)
   GUICtrlCreateLabel("100", 10, 16, 20, 20, $SS_CENTER)
   GUICtrlCreateLabel("0", 10, 390, 20, 20, $SS_CENTER)
   GUICtrlCreateLabel("100", 72, 16, 20, 20, $SS_CENTER)
   GUICtrlCreateLabel("0", 72, 390, 20, 20, $SS_CENTER)
   $m_label = GUICtrlCreateLabel("", 15, 420, 75, 20, BitOR($SS_SUNKEN, $SS_CENTERIMAGE, $SS_CENTER))
   $Btn_quitter = GUICtrlCreateButton("Quitter", 15, 450, 75, 25)
#EndRegion création de la forme

#Region programme principal
   ; on récupère les infos du mode d'alimentation
   $iPID = Run(@ComSpec & ' /C ' & $scommand_ini, '', @SW_HIDE, $STDOUT_CHILD)
   ProcessWaitClose($iPID)
   $sOutput = StdoutRead($iPID)
   ;If $debug = 1 Then ConsoleWrite($sOutput & @CRLF)
   $aArray = StringSplit(StringTrimRight(StringStripCR($sOutput), StringLen(@CRLF)), @CRLF)
   If @error Then
      MsgBox(0, "", "Il y a eu une erreur avec powercfg.")
      Exit
   EndIf

   For $i = $i_deb To $aArray[0]
      If StringInStr($aArray[$i], $string_mode_search) Then
         ;If $debug = 1 Then ConsoleWrite($aArray[$i] & @CRLF)
         $mon_string_mode = $aArray[$i]
         $i_deb = $i
         ExitLoop
      EndIf
   Next
   For $i = $i_deb To $aArray[0]
      If StringInStr($aArray[$i], $string_affichage_search) Then
         ;If $debug = 1 Then ConsoleWrite($aArray[$i] & @CRLF)
         $mon_string_affichage = $aArray[$i]
         $i_deb = $i
         ExitLoop
      EndIf
   Next

   For $i = $i_deb To $aArray[0]
      If StringRegExp($aArray[$i], $string_luminosite_search) Then
         ;If $debug = 1 Then ConsoleWrite($aArray[$i] & @CRLF)
         $mon_string_luminosite = $aArray[$i]
         $i_deb = $i
         ExitLoop
      EndIf
   Next

   For $i = $i_deb To $aArray[0]
      If StringRegExp($aArray[$i], $string_index) Then
         $mon_string_index = $aArray[$i]
         $i_deb = $i
         ExitLoop
      EndIf
   Next

   If $debug = 1 Then ConsoleWrite("$mon_string_mode=" & $mon_string_mode & @CRLF)
   If $debug = 1 Then ConsoleWrite("$mon_string_affichage=" & $mon_string_affichage & @CRLF)
   If $debug = 1 Then ConsoleWrite("$mon_string_luminosite=" & $mon_string_luminosite & @CRLF)
   If $debug = 1 Then ConsoleWrite("$mon_string_index=" & $mon_string_index & @CRLF)

   $mon_mode_tmp = StringStripWS(StringMid($mon_string_mode, StringInStr($mon_string_mode, ":") + 1), 1)
   If $debug = 1 Then ConsoleWrite($mon_mode_tmp & @CRLF)
   $mon_mode = StringLeft($mon_mode_tmp, StringInStr($mon_mode_tmp, " ") - 1)
   If $debug = 1 Then ConsoleWrite("$mon_mode=" & $mon_mode & @CRLF)

   $mon_affichage_tmp = StringStripWS(StringMid($mon_string_affichage, StringInStr($mon_string_affichage, ":") + 1), 1)
   If $debug = 1 Then ConsoleWrite($mon_affichage_tmp & @CRLF)
   $mon_affichage = StringLeft($mon_affichage_tmp, StringInStr($mon_affichage_tmp, " ") - 1)
   If $debug = 1 Then ConsoleWrite("$mon_affichage=" & $mon_affichage & @CRLF)

   $mon_luminosite_tmp = StringStripWS(StringMid($mon_string_luminosite, StringInStr($mon_string_luminosite, ":") + 1), 1)
   If $debug = 1 Then ConsoleWrite($mon_luminosite_tmp & @CRLF)
   $mon_luminosite = StringLeft($mon_luminosite_tmp, StringInStr($mon_luminosite_tmp, " ") - 1)
   If $debug = 1 Then ConsoleWrite("$mon_luminosite=" & $mon_luminosite & @CRLF)

   $mon_index_tmp = StringStripWS(StringMid($mon_string_index, StringInStr($mon_string_index, ":") + 1), 1)
   If $debug = 1 Then ConsoleWrite($mon_index_tmp & @CRLF)
   $ini_val = Dec(StringReplace($mon_index_tmp, "0x", ""))
   If $debug = 1 Then ConsoleWrite($ini_val & @CRLF)

   If $ini_val = 99999 Then
      MsgBox(0, "Erreur", "La luminosité n'a pas été trouvée !!!")
      Exit
   EndIf

   If $debug = 1 Then ConsoleWrite("$ini_val=" & $ini_val & @CRLF)
   ; on affiche la forme
   GUICtrlSetData($m_label, $ini_val & " %")
   GUICtrlSetData($m_slider, 100 - $ini_val)
   GUISetState(@SW_SHOW, $ma_forme)
   While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
         Case $Btn_quitter
            Exit
         Case $m_slider
            $new_val = 100 - GUICtrlRead($m_slider)
            If $debug = 1 Then ConsoleWrite("$new_val=" & $new_val & @CRLF)
            GUICtrlSetData($m_label, $new_val & " %")
            ; on modifie la luminosité
            $sCommand = $sCommand_deb & $mon_mode & " " & $mon_affichage & " " & $mon_luminosite & " " & $new_val
            Run($sCommand, "", @SW_HIDE)
            $sCommand = $sCommand_fin & $mon_mode
            Run($sCommand, "", @SW_HIDE)
      EndSwitch
   WEnd
#EndRegion programme principal

Voilà, voilà...

Re: [Ex] Modifier la luminosité de l'écran

Posté : mar. 24 sept. 2019 17:22
par toto1515
Bonjour,
une dernière évolution à mon script...
J'ai créé un UDF "display_brightness.au3" utilisant "powercfg " contenant 2 fonctions : _get_brightness_infos et _set_brightness.

; #FUNCTION# =====================================================================================
; Name...........: _get_brightness_infos
; Description ...: Récupère des informations concernant le mode d'alimentation
; Syntax.........: _get_brightness_infos()
; Parameters ....: Aucun
; Return values .:
;        Succès : Array
;       $array[0] : GUID du mode d'alimentaion
;       $array[1] : GUID de l'affichage
;       $array[2] : GUID de la luminosité de l'affichage
;       $array[3] : index de la luminosité
;      Echec : défini @error et retourne une info sur l'erreur
;================================================================================================

et

; #FUNCTION# ====================================================================================
; Name...........: _set_brightness
; Description ...: Modifie la luminosité de l'écran
; Syntax.........: _set_brightness($la_valeur)
; Parameters ....: la valeur de la luminosité comprise entre 0 et 100
; Return values .: Succès : Rien
;                         Echec : défini @error et retourne une info sur l'erreur
;================================================================================================

Note 1 : ça fonctionne en français car powercgf donne les résultats de ses commandes en français.

Note 2 : il y a une fonction "_m_BatteryQuery" pour déterminer si le PC est sur secteur ou sur batterie.

Pour info, j'ai un service "Dell WMI Service" (C:\Program Files (x86)\DELL\DELLOSD\DellOSDService.exe) qui doit être démarré pour que ça fonctionne. En arrêtant ce service, la modification de la luminosité ne fonctionne plus, même en passant par le panneau de configuration/options d'alimentation...
C'est bon à savoir.

Toto1515

:D

Re: [Ex] Modifier la luminosité de l'écran

Posté : lun. 07 oct. 2019 21:13
par arrkhan
Bonjour toto1515,

Si vous êtes toujours en recherche d'une solution full AutoIt, je vous conseille de vous renseigner à savoir si vos moniteurs supportent le protocole DDC/CI
Les termes suivants devraient également vous aiguiller dans votre recherche : VESA MCCS et VCP Feature

► Afficher le texteSolution de facilité :

Bonne continuation à vous !