Aktionen

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.

Important.png
Hinweis:19.09.2013: Neue Version V2.1 nach Fehlerbehebung - danke an Artur Babecki aus Polen!


Z-Slider-V2.png

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)

Loading comments...