AutoIt:Z-Slider-DemoTest-V2.au3
Aus znilwiki
Original veröffenlicht von mir unter: http://autoit.de/index.php?page=Thread&postID=239817#post239817
Z-Slider-DemoTest-V2 ist ein Beispiel, wie man GUI-Fenster in AutoIt sliden lässt.
Das Fenster dockt sich an einen Bildschirmrand an und gleitet bis auf einen kleinen Rand aus dem Bildschirm.
Wir der Mauszeiger auf diesen Rand bewegt, so gleitet das Fenster wieder herein.
Meine Lösung arbeitet problemlos auf Multimonitor-Systemen - egal wie die Bildschirme / Monitore angeordenet sind
Ihr könnt das Fenster einfach auf einen anderen Bildschirm verschieben - und schon rastet es auf diesen ein
An einer Version, die sinnlose Anordnungen erkennt arbeite ich noch (also z.B. in der Mitte zwischen 2 Monitoren)
Im Link zum AutoIt Forum ganz oben auf der Seite findet Ihr auch eine simplere Lösung die ohne Monitorprüfung arbeitet.
Hier der Download der .au3 Datei: Z-Slider-DemoTest-V2.1.au3
Hier der Quellcode:
; 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.1 nach Fehlerkorrektur - Hinweis von Artur Babecki - Danke
;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)
; Fix the "User set Window to right or bottom and move the window out at top or left"
If $iCurrentScreenNumber = 0 Then
$iCurrentScreenNumber = 1
EndIf
; End fix - thx at Artur
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
; ===============================================================================================================================
--Bernhard Linz 10:18, 19. Sept. 2013 (CET)