Bonjour,
Voici ma fonction maison et un exemple :
► Afficher le texteRésolutions entre affichages multiples
Code : Tout sélectionner
Func getResolution($display="")
Local $res[4] = [0,0,0,0], $i = 0, $n = 0
While 1
Local $struct = DllStructCreate("dword cb;char DeviceName[32];char DeviceString[128];dword StateFlags;char DeviceID[128];char DeviceKey[128]")
DllStructSetData($struct, "cb", DllStructGetSize($struct))
Local $displays = DllCall("user32.dll", "int", "EnumDisplayDevices", "ptr", 0, "dword", $i, "ptr", DllStructGetPtr($struct), "dword", 0)
If Not $displays[0] Then ExitLoop
If StringRegExp(DllStructGetData($struct, "DeviceName"),$display) And Not BitAND(DllStructGetData($struct, "StateFlags"), 0x00000008) Then
Local $infos = DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _
"ushort dmDriverExtra;dword dmFields;long x;long y;dword dmDisplayOrientation;dword dmDisplayFixedOutput;" & _
"short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _
"byte dmFormName[32];ushort LogPixels;dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _
"dword dmDisplayFlags;dword dmDisplayFrequency")
DllStructSetData($infos, "dmSize", DllStructGetSize($infos))
$displays = DllCall("user32.dll", "int", "EnumDisplaySettings", "str", DllStructGetData($struct, "DeviceName"), "dword", -1, "ptr", DllStructGetPtr($infos))
Local $x0 = DllStructGetData($infos, "x"), $y0 = DllStructGetData($infos, "y")
Local $x1 = $x0 + DllStructGetData($infos, "dmPelsWidth"), $y1 = $y0 + DllStructGetData($infos, "dmPelsHeight")
If $res[0] > $x0 Then $res[0] = $x0
If $res[1] > $y0 Then $res[1] = $y0
If $res[2] < $x1 Then $res[2] = $x1
If $res[3] < $y1 Then $res[3] = $y1
$n += 1
EndIf
$i += 1
WEnd
$res[2] = $res[2]-$res[0]
$res[3] = $res[3]-$res[1]
SetExtended($n)
Return $res
EndFunc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#Include <Array.au3>
Local $resolution = getResolution()
_ArrayDisplay($resolution, "Tout - "&@extended&" écran(s) trouvé(s)")
Local $resolution1 = getResolution("\w1$")
_ArrayDisplay($resolution1, "N°1 - "&@extended&" écran(s) trouvé(s)")
Local $resolution2 = getResolution("\w2$")
_ArrayDisplay($resolution2, "N°2 - "&@extended&" écran(s) trouvé(s)")
Local $resolution3 = getResolution("\w3$")
_ArrayDisplay($resolution3, "N°3 - "&@extended&" écran(s) trouvé(s)")
La fonction retourne un tableau de 4 éléments, et une valeur possible avec la macro @extended :
- $resultat[0] et $resultat[1] = Coordonnées X et Y du coin haut gauche de l'affichage considéré (par rapport au point O [0,0] qui correspond au coin haut gauche de l'écran considéré comme écran principal)
- $resultat[2] et $resultat[3] = Largeur et hauteur de l'affichage considéré
- @extended : Nombre d'écrans correspondant à l'affichage considéré
Attention : Je fais bien la distinction entre "affichage" et "écran". Un affichage (mon bureau dans sa globalité) peut comporter plusieurs écrans (3 par exemple), mais pas l'inverse. C'est pourquoi la fonction prend en entrée un paramètre $display qui correspond à une RegExp (Les noms d'écrans qui sont mappés par cette RegExp étant souvent de la forme "\\.\DISPLAY1", "\\.\DISPLAY2", "\\.\DISPLAY3", ...).
C'est aussi à ça que sert la macro @extended. Si elle vaut 2 alors qu'on cherche la résolution d'un seul écran, c'est que la regexp passée en paramètre n'est pas assez explicite, et matche plusieurs écrans pour cet affichage.
Voili voilou, si besoin demande moi plus de renseignements
A bientôt !
EDIT: Tiens d'ailleurs, cette fonction là pourrait avoir sa place avec les fonctions d'exemples je pense.
EDIT: Copie disponible au lien suivant :
http://www.autoitscript.fr/forum/viewto ... =21&t=9294