; Demo für Sliden von Fenstern (sanftes hinein- oder hinausgleiten) von Fenstern aus dem Bereich des Bildschirms
; Es bleibt ein kleiner Fensterrand zu sehen - wird die Maus wieder über diesen bewegt, schiebt sich das
; Fenster wieder in den Bildschirm - wo es bleibt bis die Maus wieder ausserhalb des Fensters bewegt wird.
; 11/2011 von BLinz nach dem mich SEuBo von autoit.de auf die Idee gebracht hat,
; Original Beitrag: http://www.autoit.de/index.php?page=Thread&postID=238836&highlight=slide+gui#post238836
; Version 2

;Das Fenster mit Auswahl wohin ge-slided werden soll,
;Immer noch gerne mit dem Koda erstellt (sind ja nur ein paar Label und Buttons)
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <SliderConstants.au3>
;#include <array.au3>

#Region ### START Koda GUI section ### Form=C:\_AutoIT\Z-Slider\FormMainWindow.kxf
$FormMainWindow = GUICreate("Z-Slider-DemoTest V2", 403, 433, 691, 240)
$LabelWhereIsTheMouse = GUICtrlCreateLabel("Maus ist ausserhalb des Fensters", 8, 88, 384, 25, BitOR($SS_CENTER,$SS_CENTERIMAGE,$WS_BORDER))
GUICtrlSetFont(-1, 12, 800, 0, "Courier New")
GUICtrlSetColor(-1, 0xFF0000)
$GroupGlobal = GUICtrlCreateGroup(" Globale Abfrage ", 8, 8, 384, 72)
$LabelMouseXLabel = GUICtrlCreateLabel("MouseX:", 16, 28, 60, 20)
GUICtrlSetFont(-1, 10, 800, 0, "Courier New")
$LabelMouseYLabel = GUICtrlCreateLabel("MouseY:", 16, 54, 60, 20)
GUICtrlSetFont(-1, 10, 800, 0, "Courier New")
$LabelMouseX = GUICtrlCreateLabel("0", 90, 30, 66, 17)
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
$LabelMouseY = GUICtrlCreateLabel("0", 90, 56, 66, 17)
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$GroupPosSlideWindow = GUICtrlCreateGroup(" Position Slide-Fenster ", 8, 120, 249, 201)
$ButtonTop = GUICtrlCreateButton("Oben", 80, 144, 100, 25)
$ButtonBottom = GUICtrlCreateButton("Unten", 80, 280, 100, 25)
$ButtonLeft = GUICtrlCreateButton("Links", 16, 174, 60, 100)
$ButtonRight = GUICtrlCreateButton("Rechts", 184, 174, 60, 100)
$LabelScreen = GUICtrlCreateLabel("Label1", 80, 174, 100, 100, BitOR($SS_WHITERECT,$WS_BORDER))
GUICtrlCreateGroup("", -99, -99, 1, 1)
$GroupMonitors = GUICtrlCreateGroup(" aktueller Monitor Informationen ", 8, 328, 385, 97)
$LabelMonitorAktuell = GUICtrlCreateLabel("Aktuell:", 16, 352, 68, 20)
GUICtrlSetFont(-1, 10, 800, 0, "Courier New")
$LabelMonitorGesamt = GUICtrlCreateLabel("Gesamt:", 216, 352, 60, 20)
GUICtrlSetFont(-1, 10, 800, 0, "Courier New")
$LabelMonitorPositionX = GUICtrlCreateLabel("PositionX:", 16, 376, 84, 20)
GUICtrlSetFont(-1, 10, 800, 0, "Courier New")
$LabelMonitorPositionY = GUICtrlCreateLabel("PositionY:", 16, 400, 84, 20)
GUICtrlSetFont(-1, 10, 800, 0, "Courier New")
$LabelMonitorBreite = GUICtrlCreateLabel("Breite:", 216, 376, 60, 20)
GUICtrlSetFont(-1, 10, 800, 0, "Courier New")
$LabelMonitorHoehe = GUICtrlCreateLabel("Höhe:", 216, 400, 44, 20)
GUICtrlSetFont(-1, 10, 800, 0, "Courier New")
$LabelMonitorAktuellWert = GUICtrlCreateLabel("-", 108, 352, 70, 20, $SS_RIGHT)
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
$LabelMonitorPositionXWert = GUICtrlCreateLabel("-", 108, 376, 70, 20, $SS_RIGHT)
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
$LabelMonitorPositionYWert = GUICtrlCreateLabel("-", 108, 400, 70, 20, $SS_RIGHT)
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
$LabelMonitorGesamtWert = GUICtrlCreateLabel("-", 318, 352, 70, 20, $SS_RIGHT)
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
$LabelMonitorBreiteWert = GUICtrlCreateLabel("-", 318, 376, 70, 20, $SS_RIGHT)
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
$LabelMonitorHoeheWert = GUICtrlCreateLabel("-", 318, 400, 70, 20, $SS_RIGHT)
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group1 = GUICtrlCreateGroup(" Schritte           Pause ", 264, 120, 129, 201)
$SliderSteps = GUICtrlCreateSlider(272, 168, 46, 149, BitOR($GUI_SS_DEFAULT_SLIDER,$TBS_VERT,$TBS_BOTH,$TBS_ENABLESELRANGE))
GUICtrlSetLimit(-1, 100, 2)
GUICtrlSetData(-1, 5)
$SliderSleepTime = GUICtrlCreateSlider(338, 168, 46, 149, BitOR($GUI_SS_DEFAULT_SLIDER,$TBS_VERT,$TBS_BOTH,$TBS_ENABLESELRANGE))
GUICtrlSetLimit(-1, 100, 20)
GUICtrlSetData(-1, 20)
$InputSteps = GUICtrlCreateInput("10", 275, 144, 41, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
$InputSleepTime = GUICtrlCreateInput("100", 341, 144, 41, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


; Ersteinmal die Grundeinstellungen ....
Global $nMsg ; Hier landet die Benachrichtigung von GUIGetMsg() - ob und welcher Button gedrückt wurde
Global $bWindowsIsOut = False ;Ob das Fenster gerade aus-ge-slidet ist (ja oder nein)
Global $sWindowsIsAt = "Left" ;Wohin wir das Fenster aus dem Bildschirm schieben
Global $iRealyBottom ; Sicherheitsabfrage falls der Benutzer das Fenster unten haben will
Global $aCurrentMonitors ; Hier kommen die Anzahl, Auflösung und Position der Monitore rein
Global $iCurScreenX ; Hier die X Position des aktuellen Monitors auf dem die GUI ist
Global $iCurScreenY ; dito Y Position
Global $iCurScreenWidth ; dito Breite
Global $iCurScreenHeight ; dito Höhe
Global $iCurrentScreenNumber ; Auf welchem Monitor/Bildschirm ist die GUI gerade?
Global $iLastScreenNummer = 0


WinSetOnTop($FormMainWindow,"",1) ;Fenster immer ganz oben über allen anderen
GUICtrlSetState($ButtonLeft, $GUI_DISABLE) ; Die Demo startet immer mit links, also den Button ausgrauen
GUICtrlSetData($SliderSleepTime,0) ; Slider auf Startwert
GUICtrlSetData($SliderSteps,10) ; Slider auf Startwert

$aCurrentMonitors = _GetMonitors() ;Daten der angeschlossenen Monitore holen
;	$aMonitors[0] with number of Monitors,
;   $aMonitors[x][0] Monitor X Screen wide
;   $aMonitors[x][1] Monitor X Screen height
;   $aMonitors[x][2] Monitor X Screen Position X
;   $aMonitors[x][3] Monitor X Screen Position Y

; Los geht es - die Hauptschleife
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			; Jemand hat auf das rote X oben rechts geklickt
			Exit 0
		Case $ButtonLeft
			;Fenster soll nach Links sliden
			$sWindowsIsAt = "Left" ; Neue Richtung setzen
			GUICtrlSetState($ButtonLeft, $GUI_DISABLE) ; Button ausgrauen / deaktivieren
			GUICtrlSetState($ButtonRight, $GUI_ENABLE) ; Button aktivieren
			GUICtrlSetState($ButtonTop, $GUI_ENABLE) ; Button aktivieren
			GUICtrlSetState($ButtonBottom, $GUI_ENABLE) ; Button aktivieren
		Case $ButtonRight
			; nach Rechts, sonst sinngemäß wie zuvor
			$sWindowsIsAt = "Right"
			GUICtrlSetState($ButtonLeft, $GUI_ENABLE)
			GUICtrlSetState($ButtonRight, $GUI_DISABLE)
			GUICtrlSetState($ButtonTop, $GUI_ENABLE)
			GUICtrlSetState($ButtonBottom, $GUI_ENABLE)
		Case $ButtonTop
			; nach Oben, sonst sinngemäß wie zuvor
			$sWindowsIsAt = "Top"
			GUICtrlSetState($ButtonLeft, $GUI_ENABLE)
			GUICtrlSetState($ButtonRight, $GUI_ENABLE)
			GUICtrlSetState($ButtonTop, $GUI_DISABLE)
			GUICtrlSetState($ButtonBottom, $GUI_ENABLE)
		Case $ButtonBottom
			$sWindowsIsAt = "Bottom"
			GUICtrlSetState($ButtonLeft, $GUI_ENABLE)
			GUICtrlSetState($ButtonRight, $GUI_ENABLE)
			GUICtrlSetState($ButtonTop, $GUI_ENABLE)
			GUICtrlSetState($ButtonBottom, $GUI_DISABLE)
	EndSwitch
	; Ende der GUI-Auswertung (ob der Benutzer etwas geklickt hat)
	; Alles was jetzt kommt wird ständig ausgeführt

	; Hat jemand einen der Slider bewegt? Wenn ja aber pronto umsetzen
	If (GUICtrlRead($SliderSleepTime) * 5) <> GUICtrlRead($InputSleepTime) Then
		GUICtrlSetData($InputSleepTime,(GUICtrlRead($SliderSleepTime) * 5))
	EndIf
	If GUICtrlRead($SliderSteps) <> GUICtrlRead($InputSteps) Then
		GUICtrlSetData($InputSteps,GUICtrlRead($SliderSteps))
	EndIf

	;Aktuelle Mausposition in die GUI schreiben (nur als Info)
	$aMousePosCurrent = MouseGetPos(); MouseGetPos gibt ein Array zurück,[0] = X, [1] = Y Position der Maus
	GUICtrlSetData($LabelMouseX,$aMousePosCurrent[0])
	GUICtrlSetData($LabelMouseY,$aMousePosCurrent[1])

	;Prüfen wir auf welchem Bildschirm wir sind - aber nur wenn das Fenster nicht ausgeslidet ist - sonst kommt was falsches raus
	If $bWindowsIsOut = False Then
		$iCurrentScreenNumber = _GetCurrentMonitor($FormMainWindow, $aCurrentMonitors)
	EndIf

	; Schauen wir mal ob die Maus über dem Fenster ist
	If _Is_Mouse_in_Windows($FormMainWindow) = 1 Then ; siehe _Is_Mouse_in_Windows Funktion, 1 heisst ja
		GUICtrlSetData($LabelWhereIsTheMouse, "Maus ist im Fenster!") ; Text in GUI ändern
		GUICtrlSetColor($LabelWhereIsTheMouse, 0x00FF00) ; Text grün färben
		If $bWindowsIsOut = True Then ; Fenster nur ein-sliden wenn es auch draussen war
			_SlideWindow($FormMainWindow, $aCurrentMonitors, $iCurrentScreenNumber, $sWindowsIsAt, "In", 4, GUICtrlRead($SliderSteps), GUICtrlRead($SliderSleepTime)) ; Das eigentich Sliden, siehe Funktion _SlideWindow
			$bWindowsIsOut = False ; Fenster ist nun nicht draussen!
		EndIf
	Else ; Maus ist nicht über den Fenster
		GUICtrlSetData($LabelWhereIsTheMouse,"Maus ist ausserhalb des Fensters") ; Text ändern
		GUICtrlSetColor($LabelWhereIsTheMouse, 0xFF0000); Text rot färben
		If $bWindowsIsOut = False Then ; Fenster nur aus-sliden wenn es auch drin war
			_SlideWindow($FormMainWindow, $aCurrentMonitors, $iCurrentScreenNumber, $sWindowsIsAt, "Out", 4, GUICtrlRead($SliderSteps), GUICtrlRead($SliderSleepTime))
			$bWindowsIsOut = True ; Fenster ist nun draussen!
		EndIf
	EndIf

	;In die GUI die aktuellen Werten über den Monitor eintragen
	If $iCurrentScreenNumber <> $iLastScreenNummer Then
		GUICtrlSetData($LabelMonitorAktuellWert, $iCurrentScreenNumber)
		GUICtrlSetData($LabelMonitorGesamtWert, $aCurrentMonitors[0][0])
		GUICtrlSetData($LabelMonitorBreiteWert, $aCurrentMonitors[$iCurrentScreenNumber][0])
		GUICtrlSetData($LabelMonitorHoeheWert, $aCurrentMonitors[$iCurrentScreenNumber][1])
		GUICtrlSetData($LabelMonitorPositionXWert, $aCurrentMonitors[$iCurrentScreenNumber][2])
		GUICtrlSetData($LabelMonitorPositionYWert, $aCurrentMonitors[$iCurrentScreenNumber][3])
		$iLastScreenNummer = $iCurrentScreenNumber
	EndIf
WEnd

; #FUNCTION# ====================================================================================================================
; Name ..........: _SlideWindow
; Description ...:
; Syntax ........: _SlideWindow(Byref $hwitchWindow, $sWitchSide, $sInOrOut[, $iWindowBorderSize = 4[, $iSlideSteps = 4[,$iTimebetweenSlideSteps = 100]]])
; Parameters ....: $hwitchWindow        - A handle to the Target-Window
;                  $aScreenValues		- Refer to a Array witch was created by _GetMonitors()
;                  $iScreenNum          - Number of Current Screen / Monitor
;                  $sWitchSide          - Where the Window should be slide? Possible Values are
;                                         "Left", "Right", "Top", "Bottom"
;                  $sInOrOut            - Slide window in or out? Possible Values are
;                                         "In", "Out"
;                  $iWindowBorderSize   - [optional] Size of Window Border (How many Pixel you will see if slided in)
;                  $iSlideSteps         - [optional] slide "animation"  in how many Steps? Default is 4.
;                  $iTimebetweenSlideSteps- [optional] Time in ms between the the steps, default is 100
; Return values .: None
; Author ........: BLinz
; Link ..........: http://znil.net
; Example .......: No
; ===============================================================================================================================
Func _SlideWindow(ByRef $hwitchWindow, ByRef $aScreenValues, $iScreenNum, $sWitchSide, $sInOrOut, $iWindowBorderSize = 4, $iSlideSteps = 4, $iTimebetweenSlideSteps = 100)
	Local $aScreenSize[4], $aWindowsSizeCurrent
	Local $iFrom, $iTo, $iSteps
;~ 	$aScreenSize = WinGetPos("Program Manager") ; In $aScreenSize steht nun die Größe der Desktopfläche
;~ 	                                            ; (hätte auch @DesktopHeight und @DesktopWidth nehmen können)
	; Statt der ScreenSize des gesamten Desktops arbeiten wir nun "pro Bildschirm), die Werte lassen wir uns in
	; $aScreenValues und $iScreenNum
	; Damit ich nicht alle Formeln anpassen musste habe ich hier die Variablen gleichgesetzt ...
	$aScreenSize[0] = $aScreenValues[$iScreenNum][2]
	$aScreenSize[1] = $aScreenValues[$iScreenNum][3]
	$aScreenSize[2] = $aScreenValues[$iScreenNum][0]
	$aScreenSize[3] = $aScreenValues[$iScreenNum][1]

	$aWindowSizePosCurrent = WinGetPos($hwitchWindow) ;und hier holen wir uns die Größe und Position des Fensters
	Switch $sWitchSide ; Wohin soll das Fenster ?
		Case "Left" ; Aha, linke Seite
			$iMovePixelperStep = Round($aWindowSizePosCurrent[2] / $iSlideSteps,0) ; mal eben die Schrittweite in Pixel für die "Animation" berechnen
			For $i = $iSlideSteps To 0 Step -1 ; Anzahl der Schritte auf 0 herunterzählen - ja hier ist ein "Fehler" - er macht
											   ; Immer einen Schritt mehr als angegeben - aber der letzte ist 0 und damit Endposition
				If $sInOrOut = "Out" Then ; Ok, Fenster hinaus schubsen
					WinMove($hwitchWindow,"", $aScreenSize[0] - ($aWindowSizePosCurrent[2] - ($iMovePixelperStep * $i)) + $iWindowBorderSize,$aWindowSizePosCurrent[1])
					; $aWindowSizePosCurrent[1] = Y-Position, bleibt unverändert
					; $aWindowSizePosCurrent[2] = Breite
					; ganz Links ist 0, davon ziehen wir pro Animationsschritt $i mal die Schrittweite ab. Ist i$ = 0 haben wir Endposition
					; Dazu die Breite des Randes damit dieser Sichtbar bleibt
				Else ;Fenster wieder reinholen
					WinMove($hwitchWindow,"", $aScreenSize[0] + ($iWindowBorderSize - ($iMovePixelperStep * $i)),$aWindowSizePosCurrent[1])
					;wie zuvor, jedoch + statt -, wegen der zusätzlichen BorderSize kommt das Fenster ganz heraus
				EndIf
				Sleep($iTimebetweenSlideSteps)
			Next
		Case "Right"
			$iMovePixelperStep = Round($aWindowSizePosCurrent[2] / $iSlideSteps,0)
			For $i = $iSlideSteps To 0 Step -1
				If $sInOrOut = "Out" Then
					WinMove($hwitchWindow,"", ($aScreenSize[2] + $aScreenSize[0]) - ($iMovePixelperStep * $i),$aWindowSizePosCurrent[1])
				Else
					WinMove($hwitchWindow,"", ($aScreenSize[2] + $aScreenSize[0]) - ($aWindowSizePosCurrent[2] - ($iMovePixelperStep * $i)) - $iWindowBorderSize,$aWindowSizePosCurrent[1])
				EndIf
				Sleep($iTimebetweenSlideSteps)
			Next
		Case "Top"
			$iMovePixelperStep = Round($aWindowSizePosCurrent[2] / $iSlideSteps,0)
			For $i = $iSlideSteps To 0 Step -1
				If $sInOrOut = "Out" Then
					WinMove($hwitchWindow,"", $aWindowSizePosCurrent[0], $aScreenSize[1] - ($aWindowSizePosCurrent[3] - ($iMovePixelperStep * $i)) + $iWindowBorderSize)
				Else
					WinMove($hwitchWindow,"", $aWindowSizePosCurrent[0], $aScreenSize[1] + ($iWindowBorderSize - ($iMovePixelperStep * $i)))
				EndIf
				Sleep($iTimebetweenSlideSteps)
			Next
		Case "Bottom"
			$iMovePixelperStep = Round($aWindowSizePosCurrent[2] / $iSlideSteps,0)
			For $i = $iSlideSteps To 0 Step -1
				If $sInOrOut = "Out" Then
					WinMove($hwitchWindow,"", $aWindowSizePosCurrent[0], ($aScreenSize[1] + $aScreenSize[3]) - ($iMovePixelperStep * $i))
				Else
					WinMove($hwitchWindow,"", $aWindowSizePosCurrent[0], ($aScreenSize[1] + $aScreenSize[3]) - ($aWindowSizePosCurrent[3] - ($iMovePixelperStep * $i)) - $iWindowBorderSize)
				EndIf
				Sleep($iTimebetweenSlideSteps)
			Next
	EndSwitch
EndFunc

; #FUNCTION# ====================================================================================================================
; Name ..........: _Is_Mouse_in_Windows
; Description ...:
; Syntax ........: _Is_Mouse_in_Windows(Byref $hwitchWindow[, $iWindowBorderSize = 4])
; Parameters ....: $hwitchWindow        - A handle to the Target-Window
;                  $iWindowBorderSize   - [optional] Size of the Border of Window in Pixel
; Return values .: 1 = Mouse is in the Window
;                  0 = Mouse ist NOT in the Windows
; Author ........: BLinz
; Link ..........: http://znil.net
; Example .......: No
; ===============================================================================================================================
Func _Is_Mouse_in_Windows(ByRef $hwitchWindow, $iWindowBorderSize = 4)
	Local $aMousePosCurrent, $aWindowPosCurrent
	$aMousePosCurrent = MouseGetPos()
	$aWindowPosCurrent = WinGetPos($hwitchWindow)
	; $aWindowPosCurrent[0] = X-Position
	; $aWindowPosCurrent[1] = Y-Position
	; $aWindowPosCurrent[2] = Breite
	; $aWindowPosCurrent[3] = Höhe
	; Die BorderSize berücksichtigen wir weil die nicht zu 100% den Fenstermaßen zählt, also kleiner Aufschlag
	;Rechts vom Fenster?
	If $aMousePosCurrent[0] > ($aWindowPosCurrent[0] + $aWindowPosCurrent[2] + $iWindowBorderSize) Then Return 0
	;Links vom Fenster?
	If $aMousePosCurrent[0] < ($aWindowPosCurrent[0] - $iWindowBorderSize) Then Return 0
	;Unterhalb des Fensters?
	If $aMousePosCurrent[1] > ($aWindowPosCurrent[1] + $aWindowPosCurrent[3] + $iWindowBorderSize) Then Return 0
	;Oberhalb des Fensters?
	If $aMousePosCurrent[1] < ($aWindowPosCurrent[1] - $iWindowBorderSize) Then Return 0
	; Nix hat gepasst, Maus ist über dem Fenster
	Return 1
EndFunc


; #FUNCTION# ====================================================================================================================
; Name ..........: _GetCurrentMonitor
; Description ...:
; Syntax ........: _GetCurrentMonitor(Byref $hwitchWindow, Byref $aGetMonitors)
; Parameters ....: $hwitchWindow        - handle to the window
;                  $aGetMonitors        - handle to an array which was create by _GetMonitors() Function
; Return values .: Number of Current Monitor / Screen
; Author ........: BLinz
; Link ..........: http://znil.net
; Example .......: No
; ===============================================================================================================================
Func _GetCurrentMonitor(ByRef $hwitchWindow, ByRef $aGetMonitors)
	Local $aWindowPosCurrent
	$aWindowPosCurrent = WinGetPos($hwitchWindow)
	; $aWindowPosCurrent[0] = X-Position
	; $aWindowPosCurrent[1] = Y-Position
	; $aWindowPosCurrent[2] = Breite
	; $aWindowPosCurrent[3] = Höhe
	; $aGetMonitors[0][0] with number of Monitors,
	; $aGetMonitors[x][0] Monitor X Screen wide
	; $aGetMonitors[x][1] Monitor X Screen height
	; $aGetMonitors[x][2] Monitor X Screen Position X
	; $aGetMonitors[x][3] Monitor X Screen Position Y
	For $i = 1 To $aGetMonitors[0][0]
		If $aWindowPosCurrent[0] >= $aGetMonitors[$i][2] And $aWindowPosCurrent[0] <= ($aGetMonitors[$i][2] + $aGetMonitors[$i][0]) Then
			;X Achse stimmt schon mal
			If $aWindowPosCurrent[1] >= $aGetMonitors[$i][3] And $aWindowPosCurrent[1] <= ($aGetMonitors[$i][3] + $aGetMonitors[$i][1]) Then
				Return $i ; haben wir den aktuellen Monitor gefunden!
			EndIf
		EndIf
	Next
EndFunc


; #FUNCTION# ====================================================================================================================
; Name ..........: _GetMonitors
; Description ...:
; Syntax ........: _GetMonitors()
; Parameters ....:
; Return values .: Array[0][0] with number of Monitors,
;                  Array[x][0] Monitor X Screen wide
;                  Array[x][1] Monitor X Screen height
;                  Array[x][2] Monitor X Screen Position X
;                  Array[x][3] Monitor X Screen Position Y
; Author ........: AspirinJunkie
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: http://autoit.de/index.php?page=Thread&postID=101717#post101717
; Example .......: No
; ===============================================================================================================================
Func _GetMonitors()
    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

    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
; ===============================================================================================================================
