#cs =============================================================================== Description : Fonction permettant de changer la configuration d'un écran, y compris lorsqu'on en a plusieurs. Version : 1.0 Fonctionnel avec AutoIt 3.3.8.1 et Windows 8 Auteur : Ziqumu Date : 01.01.2013 #ce ================= _ChangeMultiDispSettings ==================================== Func _ChangeMultiDispSettings($i_iDispNum = -1, $i_Width = -1, $i_Height = -1, $i_PositionX = "", $i_PositionY = "", $i_RefreshRate = -1, $i_BitsPerPel = -1, $i_Update = 0) ;Constantes windows Local Const $DM_PELSWIDTH = 0x00080000 Local Const $DM_PELSHEIGHT = 0x00100000 Local Const $DM_BITSPERPEL = 0x00040000 Local Const $DM_DISPLAYFREQUENCY = 0x00400000 Local Const $DM_POSITION = 0x00000020 Local Const $CDS_TEST = 0x00000002 Local Const $CDS_NORESET = 0x10000000 Local Const $CDS_UPDATEREGISTRY = 0x00000001 Local Const $CDS_SET_PRIMARY= 0x00000010 Local Const $CDS_ENABLE_UNSAFE_MODES= 0x00000100 Local Const $CDS_RESET= 0x40000000 Local Const $DISP_CHANGE_RESTART = 1 Local Const $DISP_CHANGE_SUCCESSFUL = 0 Local Const $HWND_BROADCAST = 0xffff Local Const $WM_DISPLAYCHANGE = 0x007E Local Const $ENUM_CURRENT_SETTINGS = -1 ;init autres variablse Local $T Local $iDispNum, $Width, $Height, $PositionX, $PositionY, $BitsPerPel, $RefreshRate ;verif et traitement des variables d'entrée If $i_iDispNum > 0 Then $iDispNum = 1 Else $iDispNum = 0 EndIf If $i_Width > 0 Then $Width = 1 If $i_Height > 0 Then $Height = 1 If IsNumber($i_PositionX) Then $PositionX = 1 If IsNumber($i_PositionY) Then $PositionY = 1 If $i_BitsPerPel > 0 Then $BitsPerPel = 1 If $i_RefreshRate > 0 Then $RefreshRate = 1 $i_iDispNum-=1 ; car l'index des écrans commence à 0 (0 étant l'écran principal) ; Récup de l'identifiant de l'écran Local $DISPLAY_DEVICE = DllStructCreate("DWORD cb;CHAR DeviceID[32];CHAR DeviceContext[128];DWORD;CHAR[128];CHAR[128]") DllStructSetData ($DISPLAY_DEVICE, "cb", DllStructGetSize($DISPLAY_DEVICE)) $T = DllCall("user32.dll", "bool", "EnumDisplayDevices", "ptr", 0, "dword", $i_iDispNum , "ptr", DllStructGetPtr($DISPLAY_DEVICE),"dword",0) If @error Or $T = 0 Then ;ConsoleWrite("Erreur : Ecran non identifié") & @CRLF) SetError(1) Return -11 EndIf ;ConsoleWrite("Identifiant de l'écran : " & DllStructGetData($DISPLAY_DEVICE, "DeviceID") & @CRLF) ;ConsoleWrite("Contexte de l'écran : " & DllStructGetData($DISPLAY_DEVICE, "DeviceContext") & @CRLF) ; Récup des réglages acutels de l'écran Local $DEVMODE = DllStructCreate("char[32];word[4];dword dmFields;long[2];dword[2];short[5];char[32];word;dword[5]") DllStructSetData($DEVMODE, 2, DllStructGetSize($DEVMODE), 3) $T = DllCall("user32.dll", "int", "EnumDisplaySettingsEx", "str", DllStructGetData($DISPLAY_DEVICE,"DeviceID"), "int", $ENUM_CURRENT_SETTINGS, "ptr", DllStructGetPtr($DEVMODE), "int",0) If @error Or $T = 0 Then ;ConsoleWrite("Erreur : Impossible de récuperer les réglages acutels de l'écran") & @CRLF) SetError(1) Return -12 EndIf Local $retour[2] $retour[0]=DllStructGetData($DEVMODE, 9, 2) $retour[1]=DllStructGetData($DEVMODE, 9, 3) ; ConsoleWrite("Résolution actuelle : " & DllStructGetData($DEVMODE, 9, 2) & "x" & DllStructGetData($DEVMODE, 9, 3) & @CRLF) ;ConsoleWrite("Fréquence de rafraîchissement : " & DllStructGetData($DEVMODE, 9, 5) & "Hz" & @CRLF) ;ConsoleWrite("Profondeur des couleurs : " & DllStructGetData($DEVMODE, 9, 1) & "bits" & @CRLF) ;Détermination des nouveaux paramêtres Local $dmFieldsVar, $count=0; ;Largeur if $Width = 1 Then $dmFieldsVar = BitOR($DM_PELSWIDTH, $dmFieldsVar) DllStructSetData($DEVMODE, 9, $i_Width, 2) $count+=1 EndIf ;Hauteur if $Height = 1 Then $dmFieldsVar = BitOR($DM_PELSHEIGHT, $dmFieldsVar) DllStructSetData($DEVMODE, 9, $i_Height, 3) $count+=1 EndIf ;Position en X et Y if $PositionX = 1 And $PositionY = 1 Then $dmFieldsVar = BitOR($DM_POSITION, $dmFieldsVar) DllStructSetData($DEVMODE, 4, $i_PositionX, 3) DllStructSetData($DEVMODE, 4, $i_PositionY, 2) $count+=1 EndIf ;Fréquence if $RefreshRate = 1 Then $dmFieldsVar = BitOR($DM_DISPLAYFREQUENCY, $dmFieldsVar) DllStructSetData($DEVMODE, 8, $i_RefreshRate, 3) $count+=1 EndIf ;Profondeur if $BitsPerPel = 1 Then $dmFieldsVar = BitOR($DM_BITSPERPEL, $dmFieldsVar) DllStructSetData($DEVMODE, 8, $i_BitsPerPel, 3) $count+=1 EndIf ;Valeurs définie DllStructSetData($DEVMODE, "dmFields", $dmFieldsVar) ;Verif si des nouveaux parametres on été donné If $count < 1 And $iDispNum = 1 Then Return $retour ElseIf $count < 1 And $iDispNum <> 1 Then DllCall("user32.dll", "long", "ChangeDisplaySettingsEx", "ptr", 0, "ptr", 0,"ptr",0,"dword",0 ,"ptr" , 0) ;ConsoleWrite("Reset de l'affichage" & @CRLF) Return $retour EndIf ;Vérification si les nouveaux paramêtres sont possibles $T = DllCall("user32.dll", "long", "ChangeDisplaySettingsEx", "str", DllStructGetData($DISPLAY_DEVICE,"DeviceID"), "ptr", DllStructGetPtr($DEVMODE),"hwnd",0,"dword",$CDS_TEST ,"lparam", 0) ;Execution où non en fonction de la réponse $T = $T[0] Select Case @error ;ConsoleWrite("Erreur : Impossible d'éxecuter les nouveaux paramêtres") & @CRLF) SetError(1) Return -13 Case $T=0 ;Application des parametre et ecriture dans le registre Local $Flag = $CDS_UPDATEREGISTRY If $i_Update = 1 Then $Flag = BitOR($CDS_NORESET , $CDS_UPDATEREGISTRY) If $i_Update = -1 Then $Flag = BitOR($CDS_RESET , $CDS_UPDATEREGISTRY) $T = DllCall("user32.dll", "long", "ChangeDisplaySettingsEx", "str", DllStructGetData($DISPLAY_DEVICE,"DeviceID"), "ptr", DllStructGetPtr($DEVMODE),"HWND",0,"dword",$Flag ,"int" , 0) If @error Then ;ConsoleWrite("Erreur inconnu provenant de l'application des paramètres" & @CRLF) SetError(1) Return -14 ElseIf $T = -3 Then ; ConsoleWrite("Erreur : Le pilote graphique n'a pas réussi à appliquer les nouveaux paramètres (DISP_CHANGE_NOTUPDATED)" & @CRLF) Return -3 EndIf ;Envoi d'un message à toutes les fenêtre pour prévenir d'un changement de résolution DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, "int", $i_BitsPerPel, "int", $i_Height * 2 ^ 16 + $i_Width) ;ConsoleWrite("Nouveaux paramêtres appliqués avec succès ! (DISP_CHANGE_SUCCESSFUL)" & @CRLF) Return $retour Case $T=1 ;ConsoleWrite("Les nouveaux paramêtres nécessitent un redémarrage pour être appliqués. (DISP_CHANGE_RESTART)" & @CRLF) SetError(1) Return 1 Case $T=-1 ;ConsoleWrite("Erreur : Le pilote graphique n'a pas réussi à appliquer les nouveaux paramètres (DISP_CHANGE_FAILED)" & @CRLF) SetError(1) Return -1 Case $T=-2 ;ConsoleWrite("Erreur : Le mode graphique demandé n'est pas supporté (DISP_CHANGE_BADMODE)" & @CRLF) SetError(1) Return -2 Case Else ;ConsoleWrite("Erreur inconnu provenant de la vérification des paramètres. Code d'erreur : " & $T & @CRLF) SetError(1) Return -2 Case EndSelect EndFunc;==>_ChangeMultidispSettings