Moin Moin,
vor einiger Zeit hatte ich diese Demo von SEuBo gefunden: [Beispiel] Slide GUI
Die Idee fand ich toll - die ideale Ergänzung für meinen "Dateiwerfer" (stelle ich vor wenn er fertig ist) ....
Aber, entschuldige SEuBo, fand ich die Lösung ... kompliziert. Ich hatte es zwar damit hinbekommen, habs wohl auch verstanden ... wollt es aber anderes gelöst haben (ohne DLL Aufrufe z.B.)
Meine Lösung hat noch folgende "Pferdefüsse":
wird nicht auf Multi-Monitor Systemen mit negativen Koordinaten funktionierenfunktioniert nicht auf sehr unsymetrischen Multi-Monitor Anordnungen (2 Bildschirme oben, einer rechts unten) in allen Richtungenhat noch irgendeinen Fehler bei vertikalen Scrollen auf dem 3. Monitor bei mir (unten rechts), alle anderen funktionieren perfekt
Features / Vorteile:
- Fenster lassen sich noch verschieben (innerhalb der Seite und von Monitor zu Monitor)
- Einfachere Abfrage in der Hauptschleife (Ist die Maus drüber oder nicht?)
- Läuft auch mit mehreren Fenstern. (Tut SEuBo Lösung auch)
- Animationsschritte + Geschwindigkeit beim Sliden der Fenster lassen sich leicht anpassen
ToDo's:
Anpassen für negative Desktop-PositionenAnpassen für wilde Monitor-Anordnungen- Auswahl des Randes nicht mehr über Button's machen sondern durch das verschieben des Fensters an den jeweiligen Rand ... mit optischen Feedback ...
- Erkennen von "Sinnlosen" Anordnungen - wie den Übergang zwischen 2 Monitoren ... da die aber unterschiedliche Auflösungen haben können nicht einfach ...
Die Demo hat Schaltflächen mit denen die Position verändert werden kann - nach der Änderung Maus mal kurz aus dem Fenster schieben.
Update 25.11.2011: Version V2
- Zusätzliche Slider für die Animationseffekte (Schritte und Zeit) eingebaut
- Fenster lässt sich nun frei auf anderen Monitor verschieben und verbleibt dann dort
Update 26.11.2011: Version V2
- Hab den dämlichen Fehler gefunden warum es auf den 3. Monitor nicht ging, ich hatte einfach eine Anpassung vergessen
- Sicherheitsabfrage für Anordnung unten entfernt - es funktioniert jetzt zuverlässig auf den wildesten Monitoranordnungen
Update 19.09.2013: Version V2.1
- Wenn ein Benutzer auf die Idee kam, das Fenster außerhalb des Bildschirms zu verschieben (z.B. über den linken Rand hinaus) war die obere linke Ecke des Fensters auf keinen Bildschirm mehr - und es kam zu einem Dauerslide. Es wurde eine Prüfung dafür eingebaut die im Zweifel den aktiven Monitor wieder auf 1 setzt - denn ein Monitor muss es mindestens geben. Sollte dies nicht der Fall sein fällt der Fehler sowieso nicht auf
- Dank an Artur Babecki aus Polen für den Hinweis auf den Fehler
Update 29.10.2013: Version V2.2
- Fehler behoben mit dem "Fenster flackern" in der Mitte Danke an rynow
Hier die erste Version - läuft gut, hat aber Probleme mit Multi-Monitor Systemen mit negativen Koordinaten
Spoiler anzeigen
; 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…+gui#post238836
; Meine Lösung arbeitet ohne DLL aufrufe, "simpler" und besser kommentiert *g*
;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>
#Region ### START Koda GUI section ### Form=C:\_AutoIT\Z-Slider\FormMainWindow.kxf
$FormMainWindow = GUICreate("Z-Slider-DemoTest", 403, 331, 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, 385, 201)
$ButtonTop = GUICtrlCreateButton("Oben", 160, 144, 100, 25)
$ButtonBottom = GUICtrlCreateButton("Unten", 160, 280, 100, 25)
$ButtonLeft = GUICtrlCreateButton("Links", 96, 174, 60, 100)
$ButtonRight = GUICtrlCreateButton("Rechts", 264, 174, 60, 100)
$LabelScreen = GUICtrlCreateLabel("Label1", 160, 174, 100, 100, BitOR($SS_WHITERECT,$WS_BORDER))
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
WinSetOnTop($FormMainWindow,"",1) ;Fenster immer ganz oben über allen anderen
GUICtrlSetState($ButtonLeft, $GUI_DISABLE) ; Die Demo startet immer mit links, also den Button ausgrauen
; 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
; nach Unten, sonst sinngemäß wie zuvor - jedoch mit Sicherheitsabfrage
; Sicherheitsabfrage da bei meiner Monitoranordnung (3 Stück) das Fenster im Nirvana verschwindet
$iRealyBottom = MsgBox(1,"Fenster unten plazieren","Wollen Sie das Fenster wirklich unten plazieren?" & @CRLF & _
"Ja nach Anzahl und Anordnung der Monitore kann das Fenster dabei in den nicht" & @CRLF & _
"Bereich landen - bzw. hinter der Taskleiste unerreichbar") ; 1 = OK und Abbrechen Button anzeigen
If $iRealyBottom = 1 Then ; 1 = Ok Button wurde gedrückt (Abbrechen wäre 2)
$sWindowsIsAt = "Bottom"
GUICtrlSetState($ButtonLeft, $GUI_ENABLE)
GUICtrlSetState($ButtonRight, $GUI_ENABLE)
GUICtrlSetState($ButtonTop, $GUI_ENABLE)
GUICtrlSetState($ButtonBottom, $GUI_DISABLE)
EndIf
EndSwitch
; Ende der GUI-Auswertung (ob der Benutzer etwas geklickt hat)
; Alles was jetzt kommt wird ständig ausgeführt
;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])
; 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,$sWindowsIsAt,"In") ; 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,$sWindowsIsAt,"Out")
$bWindowsIsOut = True ; Fenster ist nun draussen!
EndIf
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
; $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, $sWitchSide, $sInOrOut, $iWindowBorderSize = 4, $iSlideSteps = 4, $iTimebetweenSlideSteps = 100)
Local $aScreenSize, $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)
$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,"", 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,"", 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] - ($iMovePixelperStep * $i),$aWindowSizePosCurrent[1])
Else
WinMove($hwitchWindow,"", $aScreenSize[2] - ($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], 0 - ($aWindowSizePosCurrent[3] - ($iMovePixelperStep * $i)) + $iWindowBorderSize)
Else
WinMove($hwitchWindow,"", $aWindowSizePosCurrent[0], 0 + ($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[3] - ($iMovePixelperStep * $i))
Else
WinMove($hwitchWindow,"", $aWindowSizePosCurrent[0], $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
Stand 26.11.2011: Hier Version V2 - Multi-Monitor fähig, Verschieben des Fensters zwischen den Monitoren
Spoiler anzeigen
; 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…+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 ..........: https://autoit.de/index.php?page…1717#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)
[/autoit] [autoit][/autoit] [autoit]$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)
[/autoit] [autoit][/autoit] [autoit]$iCount = Int(DllStructGetData($strctCount, "Count"))
[/autoit] [autoit][/autoit] [autoit]Local $aMonitors[$iCount+1][4] = [[$iCount]]
[/autoit] [autoit][/autoit] [autoit]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
; ===============================================================================================================================
Stand 29.10.2013: Hier Version V2.2
Spoiler anzeigen
; 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…+gui#post238836
; Version 2.1 nach Fehlerkorrektur - Hinweis von Artur Babecki - Danke
; Version 2.2 nach Fehlerkorrektur "Hüpfendes Fenster"
;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[3] / $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[3] / $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 ..........: https://autoit.de/index.php?page…1717#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)
[/autoit] [autoit][/autoit] [autoit]$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)
[/autoit] [autoit][/autoit] [autoit]$iCount = Int(DllStructGetData($strctCount, "Count"))
[/autoit] [autoit][/autoit] [autoit]Local $aMonitors[$iCount+1][4] = [[$iCount]]
[/autoit] [autoit][/autoit] [autoit]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
; ===============================================================================================================================
; ===============================================================================================================================
[/autoit]Wie immer nehme ich Vorschläge über Verbesserungen, insbsondere wie man manches kürzer/einfacher machen kann, gerne an.
BLinz