[Beispiel] - Fenster Sliden (hinein- hinausgeleiten) auf dem Desktop - optimiert für Multi-Monitorlösungen

  • 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 funktionieren
    • funktioniert nicht auf sehr unsymetrischen Multi-Monitor Anordnungen (2 Bildschirme oben, einer rechts unten) in allen Richtungen
    • hat 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-Positionen
    • Anpassen 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
    [autoit]

    ; 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*

    [/autoit] [autoit][/autoit] [autoit]

    ;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 ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    WinSetOnTop($FormMainWindow,"",1) ;Fenster immer ganz oben über allen anderen
    GUICtrlSetState($ButtonLeft, $GUI_DISABLE) ; Die Demo startet immer mit links, also den Button ausgrauen

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ;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])

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit]


    Stand 26.11.2011: Hier Version V2 - Multi-Monitor fähig, Verschieben des Fensters zwischen den Monitoren

    Spoiler anzeigen
    [autoit]


    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ;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>

    [/autoit] [autoit][/autoit] [autoit]

    #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 ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ;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])

    [/autoit] [autoit][/autoit] [autoit]

    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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]

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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"))

    [/autoit] [autoit][/autoit] [autoit]

    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]


    Stand 29.10.2013: Hier Version V2.2

    Spoiler anzeigen
    [autoit]


    ; 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"

    [/autoit] [autoit][/autoit] [autoit]

    ;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>

    [/autoit] [autoit][/autoit] [autoit]

    #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 ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ;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])

    [/autoit] [autoit][/autoit] [autoit]

    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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]

    [/autoit] [autoit][/autoit] [autoit]

    $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])

    [/autoit] [autoit][/autoit] [autoit]

    ; $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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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"))

    [/autoit] [autoit][/autoit] [autoit]

    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] [autoit][/autoit] [autoit]

    ; ===============================================================================================================================

    [/autoit]


    Wie immer nehme ich Vorschläge über Verbesserungen, insbsondere wie man manches kürzer/einfacher machen kann, gerne an.

    BLinz

  • Super Sache!

    Leider "ruckeln" die Fenster noch ein wenig, das sliden müsste etwas sanfter geschehen, dann wäre es optimal
    (oder ist das nur auf meinem Berufsschul-PC so ruckelig?)

    Aber, entschuldige SEuBo, fand ich die Lösung ... kompliziert.


    Ging mir ähnlich - deswegen hatte ich vor ewiger Zeit mal das hier gemacht
    WinSlide UDF

    Trotzdem schönes Script, und feine Umsetzung :)

  • Ging mir ähnlich - deswegen hatte ich vor ewiger Zeit mal das hier gemacht
    WinSlide UDF


    ;) glaubst du mir das 90% der Leute auf dem von mir genannten Post von dir landen und nicht auf deiner UDF ... die hatte ich noch gar nicht gesehen.

    Man findet halt nur wonach man sucht .... ?(

    Das ruckeln liesse sich einstellen - einfach mehr Schritte beim Aufruf der Funktion angeben ... ich werde es in die nächste Demo einbauen (zum Auswählen)

    Bei mir, Windows 7, 64Bit, sieht es recht sanft (aktzeptabel) aus. WinMove kann ja selbst das sanfte machen - aber selbstg bei einem Wert von 100 ist es viel zu langsam.

    BLinz

  • Funzt nicht im Multi Monitor Betrieb (siehe Bild)!

    Du kannst z.B. die Größe so abfragen:

    [autoit]


    $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]")
    $aFullScreen = WinGetPos($hFullScreen)

    [/autoit]

    In aFullScreen stehen die Infos.
    Bei mir:

    Code
    @@ Debug(3) : $aFullScreen[0] = -1280
    >Error code: 0
    @@ Debug(4) : $aFullScreen[1] = 0
    >Error code: 0
    @@ Debug(5) : $aFullScreen[2] = 2960
    >Error code: 0
    @@ Debug(6) : $aFullScreen[3] = 1050

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ah,

    also kann ich mit WindGetPos die Verschiebung des Desktops abfragen - prima, baue ich ein.

    Löst leider noch nicht das Problem mit der "wilden" Anordnung bei mir.
    Ziel ist es, das ich erkenne auf welchen Bildschirm wir gerade sind, wie dessen Größe und Position sind - und dann pro Bildschirm ausrichten.

    Eine Abfrage hierfür habe ich schon gefunden ... nur wieder sehr mächtig mit einigen DLL Aufrufen. mal schauen.

    Danke!

  • habe ein Update gemacht (siehe Post 1)

    Änderungen im Detail

    • Fensterkoordinaten werden nun "pro Monitor" ermittelt und verwendet
    • Das Demo Fenster lässt sich nun frei auf einen anderen Monitor verschieben und dockt sich dann dort ein
    • 2 Slider für die Anzahl der Animationsschritte und die Pausezeit dazwischen eingebaut (bei mir unter Windows 7 sieht es auch bei 2 oder 3 Schritten sanft animiert aus)
    • Anzeige eingebaut die den gerade aktuellen Monitor mit seinen Daten anzeigt

    Ich habe da aber noch ein komisches Problem was nicht in meinen Kopf will:
    Schaut euch das Bild zu diesem Post an - wenn ich das Fenster auf Monitor 3 schiebe funktioniert links/rechts wunderbar .... aber oben / unten nicht. Das Fenster landet dann weit darüber auf Monitor 2 - acuh wenn er weiter tapfer behauptet auf Monitor 3 zu sein ....
    Vielleicht ist es auch einfach zu spät :)

    Problem gelöst! (26.11.2011)

    BLinz

  • Erinnert mich an eine Bastelei, die ich vor ~4,5 Jahren mal gemacht habe: Slide Window


    :S Es wird wohl schwer, nicht etwas zu schreiben was nicht irgendjemand irgendwann schon mal so oder so ähnlich gemacht hat :)

    Wie bei dir wahrscheinlich auch ist der Weg der Spaß ... wenn es fertig ist ... langweilig ...

    Genau genommen schreibe ich die ganze Zeit an einem anderen Programm ... und komme durch solche Spielerreien (wie auch das Tastenkombinationen ermitteln) immer wieder davon ab - schön, nicht? ^^

  • Noch ein Update,

    Script V2 und Download der au3-Datei aktualisiert.

    Änderungen:

    • Fehler mit vertikalen Scrolling entfernt (es war gestern einfach zu spät)
    • Sicherheitsabfrage für die Plazierung unten entfernt - es funktioniert jetzt zuverlässig auch bei den wildesten Monitoranordnungen
  • Läuft bei mir mit 2 Monitoren genauso wie im Post #4.

    Ferner stört das geflimmere. Kannst ja nur dann updaten, wenn sich auch was verändert hat!

    gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Läuft bei mir mit 2 Monitoren genauso wie im Post #4.


    Also ich habe eben extra mal meine 3 Monitore im Minutentakt durcheinander geworfen, mit negativen Koordinaten, positiven usw. - läuft perfekt...
    Hast du auch wirklich das V2 Skript getestet? Das mit den Schiebereglern?

    Ferner stört das geflimmere. Kannst ja nur dann updaten, wenn sich auch was verändert hat!


    Was nutzt du denn ?( Windows 7 oder XP? Unter Windows 7 scheint das System das glatt zu ziehen (sieht, wenn schnell genug, immer sanft aus). Hast du mal an den Schiebern gespielt ob der Effekt sich verbessern lässt? Schliesslich kann es ja extra alles eingestellt werden. Ich habe die Schieberegler (Slider) von den Werten begrenzt (was mir gerade sinnvoll erschien), möglich sind alle Werte.


    Ich habe die "alte" Version mit absicht gelassen - weil sie doch um einiges ... "unkomplexer" ist. Ich vermute stark, du hats dir noch einmal die Ur-Version heruntergeladen statt der V2 Version.

    BLinz

  • Was mir heute morgen noch einfiel ...

    UEZ, beim ersten Start wird es wieder wie "immer" aussehen - dann pack mal das Fenster und schiebe es auf den linken Monitor.

    Ich werde die GUI noch mal um eine Monitorauswahl erweitern ... das mit dem Verschieben ist vielleicht doch nicht so intuitiv wie ich dachte....

  • Ich habe die V2 getestet. Wenn ich 2 Monitore nebeneinander habe, dann bleibt das Fenster in der Mitte wie im Screenshot, wenn die GUI auf dem rechten Fenster initiiert wurde.
    Wenn das Fenster in den linken Monitor verschoben wurde, dann ist das Verhalten wieder richtig.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hallo UEZ,

    danke für das noch einmal testen.

    Ja - das ist im Moment das "gewollte" Verhalten. Um es zu umgehen müsste ich eine "Wo ist der Rand zu den anderen Monitoren" Erkennung einbauen.

    Wenn wie bei mir es z.B. 3 Monitore mit 3 verschiedenen Auflösungen sind ist dies nicht ganz trivial (zündende Ideen willkommen).
    Das gehört zu den Dingen die in meinem Kopf gerade noch etwas reifen müssen .... wenn ich eine Lösung habe kommt das nächste Update.

    BLinz

  • Artur Babecki aus Polen hatte mich angeschrieben und einen Fehler in der Demo entdeckt.

    Und zwar wenn der Benutzer das Fenster von Hand nach außerhalb des Bildschirms verschiebt kommt es zu einem dauersliden.
    Passiert z.B. wenn man das Fenster per Button rechts an den Rand heftet und dann das Fenster nach links aus dem Bildschirm schiebt - reicht das die linke obere Ecke außerhalb des Bildschirms ist.

    Korrigierte Fassung 2.1 im ersten Post eingefügt

    BLinz

  • BLinz vorerst super UDF genau das was ich aktuell benötige. Dennoch habe ich einen Fehler, denn ich nicht geschafft habe zu beheben.

    Wenn mann den Slide auf Top oder Bottom einstellt und die Höhe der GUI auf 100 setzt, springt die GUI beim Verlassen immer zu erst in die Mitte des Bildschirms und Slidet erst von dort hoch bzw. runter.

    Ich hoffe du verstehst was ich meine.

  • Bei mir klappt es oben, unten sowie rechts. Links habe ich eine Desktoperweiterung, und dort geht er steil :D

    Er fährt aus dem Bild des ersten Monitors ganz normal, logisch sehe ich es auf dem zweiten dann. Wenn ich mit der Maus dann auf den zweiten Monitor gehe schiebt der sich die ganze Zeit von links nach rechts über die Monitorkante.

    Ziehe ich die GUI auf den zweiten funktioniert es dort oben, unten und links, und an der rechten Seite ist dann das gleiche Spielchen wie grad beschrieben.

    #Edit: also ziemlich gleich wie bei UEZ denke ich.

    Grüße Yaerox

    Grüne Hölle

  • Lösung .. Jein.

    Ich habe bereits ein Tool geschrieben welches sinnvolle Seiten in einer Multi-Mon-Konfiguration erkennt:

    [Beispiel] - Multi-Monitorkonfiguration ermitteln, grafisch darstellen und die Ränder der Monitore zueinander bzw. freie Ränder finden

    Das müsste man jetzt nur noch verbinden ..... *g*

    BLinz

  • oh total vergessen mitzuteilen. Denn von mir geschliderten Fehler habe ich bereits gefunden und behoben.

    Hierbei war einfach ein Array-Wert in der Funktion falsch gesetzt, sodass die Gui beim hinauf oder hinab sliden immer erst zur mitte des Bildschirmes gesprungen ist. (Dies kann man erst feststellen, wenn die GUI unter 200 px Hoch ist)

    Original:

    [autoit]

    Case "Top"
    $iMovePixelperStep = Round($aWindowSizePosCurrent[2] / $iSlideSteps,0)

    [/autoit][autoit]

    Case "Bottom"
    $iMovePixelperStep = Round($aWindowSizePosCurrent[2] / $iSlideSteps,0)

    [/autoit]

    Korrektur:

    [autoit]

    Case "Top"
    $iMovePixelperStep = Round($aWindowSizePosCurrent[3] / $iSlideSteps,0)

    [/autoit][autoit]

    Case "Bottom"
    $iMovePixelperStep = Round($aWindowSizePosCurrent[3] / $iSlideSteps,0)

    [/autoit]