Hallo zusammen,
das nachfolgende Script taucht immer wieder in diversen Foren auf - es ist also nicht von mir
Spoiler anzeigen
#include-once
[/autoit] [autoit][/autoit] [autoit]Func _GetMonitorInfo()
;Returns some informations about your screens
;Call: _GetMonitorInfo()
;Return: Array With
;[0][0] Nr of Monitors
;[1][0] X Resolution of Monitor 1
;[1][1] Y Resolution of Monitor 1
;[1][2] X Position of Monitor 1
;[1][3] Y Position of Monitor 1
;[2][0] X Resolution of Monitor 2
;[2][1] Y Resolution of Monitor 2
;[2][2] X Position of Monitor 2
;[2][3] Y Position of Monitor 2
;......
Local $NrOfMonitors, $ResolutionX[32], $ResolutionY[32], $PositionX[32], $PositionY[32], $Ret
Local $cbMonitorEnumProc = DllCallbackRegister("MonitorEnumProc", "ubyte", "ptr;ptr;ptr;int")
If @error Then Return SetError(1, 0, False)
Local $strctCount = DllStructCreate("uint Count;uint Width[12];uint Height[12];int left[12];int top[12]")
If @error Then Return SetError(2, @error, False)
Local $iCount
DllStructSetData($strctCount, "Count", 0)
$Ret = DllCall("User32.dll", "ubyte","EnumDisplayMonitors","ptr", 0,"ptr", 0, "ptr", DllCallbackGetPtr($cbMonitorEnumProc), "ptr", DllStructGetPtr($strctCount))
If @error Or $Ret[0] = 0 Then Return SetError(3, @error, False)
DllCallbackFree($cbMonitorEnumProc)
$iCount = Int(DllStructGetData($strctCount, "Count"))
Local $aMonitors[$iCount+1][4] = [[$iCount]]
For $i = 1 To $iCount
$aMonitors[$i][0] = Int(DllStructGetData($strctCount, "Width",$i))
$aMonitors[$i][1] = Int(DllStructGetData($strctCount, "Height",$i))
$aMonitors[$i][2] = Int(DllStructGetData($strctCount, "left",$i))
$aMonitors[$i][3] = Int(DllStructGetData($strctCount, "top",$i))
Next
$strctCount = 0
Return $aMonitors
EndFunc
Func MonitorEnumProc($hMonitor, $hdcMonitor, $lprcMonitor, $dwData)
Local $strctRECT = DllStructCreate("long left;long top;long right;long bottom", $lprcMonitor)
Local $strctCount = DllStructCreate("uint Count;uint Width[12];uint Height[12];int left[12];int top[12]", $dwData)
Local $iNumber = DllStructGetData($strctCount, "Count")
Local $Height = Int(DllStructGetData($strctRECT, "bottom"))-Int(DllStructGetData($strctRECT, "top"))
Local $Width = Int(DllStructGetData($strctRECT, "right"))-Int(DllStructGetData($strctRECT, "left"))
DllStructSetData($strctCount, "Width", $Width, $iNumber+1)
DllStructSetData($strctCount, "Height", $Height, $iNumber+1)
DllStructSetData($strctCount, "left", Int(DllStructGetData($strctRECT, "left")), $iNumber+1)
DllStructSetData($strctCount, "top", Int(DllStructGetData($strctRECT, "top")), $iNumber+1)
DllStructSetData($strctCount, "Count", $iNumber+1)
Return True
EndFunc
Es gibt die Anzahl der Monitore, deren Auflöung und Position zurück.
Das funktioniert auch wunderbar!
Bisher habe ich jedoch immer gedacht, dass wenn ich $aMonitors[1][0] verwende, die X-Auflösung des 1. Monitors erhalte.
Dies stimmte auch bis jetzt. Nun habe ich jedoch einen neuen Grafikkarten - Treiber installiert. Jetzt stimmt diese Nummer nicht mehr mit dem überein, was Windows bestimmt.
Mit anderen Worten: Gehe ich in die Systemsteuerung und drücke bei den Monitoren auf "Identify / Identifizieren" dann werden mir ja die Monitornummer auf jedem Bildschirm kurz eingeblendet.
Und genau diese Nummern möchte ich eigentlich mit AutoIt auslesen.
Bei gewissen Grafikkarten / Treibern stimmen die Nummern (zufälligerweise ?) überein. Aber nicht immer!
Kann man die Nummern auch über eine DLL bestimmen?
Grüsse
Veronesi