1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BLinz

Beiträge von BLinz

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

    • BLinz
    • 21. November 2011 um 00:18

    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

    Dateien

    Z-Slider-DemoTest-V2.2.au3 22,47 kB – 417 Downloads Z-Slider-DemoTest.au3 12,57 kB – 498 Downloads Z-Slider-V2.png 27,16 kB – 0 Downloads Z-Slider-DemoTest-V2.au3 22,21 kB – 466 Downloads Z-Slider-DemoTest-V2.1.au3 22,41 kB – 408 Downloads
  • Taste dauerhaft gedrückt halten

    • BLinz
    • 20. November 2011 um 20:02

    Du bist mir eine Nase, das ist doch die Frage die du im Juni schon mal gestellt hast: [ gelöst ] Problem mit HotKeySet() und Send()

  • Taste dauerhaft gedrückt halten

    • BLinz
    • 20. November 2011 um 19:56

    Moin,

    jupp, geit, hab mal ein schnelles Beispiel geschrieben:

    Spoiler anzeigen
    [autoit]

    ;taste drücken solange eine andere taste gedrückt ist:
    #include <Misc.au3> ; für _IsPressed

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

    ;die nächsten kommen vom Koda Form Designer
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=C:\_AutoIT\AutoIt.de\tastedrueckenBeispiel.kxf
    $Form2 = GUICreate("Drücke a bekomme b Demo", 405, 294, 302, 218)
    $Edit1 = GUICtrlCreateEdit("", 8, 48, 377, 233)
    GUICtrlSetData(-1, "Edit1")
    $Label1 = GUICtrlCreateLabel("Unten in das Edit-feld kilcken und 'a' drücken", 8, 16, 218, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ;DLL laden wie im Beispiel zu _IsPressed
    Global $dll = DllOpen("user32.dll")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    If _IsPressed("41", $dll) = 1 Then ; 41 ist a - siehe Hilfe von _IsPressed
    Send("b") ; erklärt sich wohl von selbst
    EndIf
    WEnd

    [/autoit]

    So, jetzt kommt ein ABER ...
    wie du testen kannst sendet ein a auch ein b - aber auch das a, diesen Tastendruck fangen wir nicht ab. Wei das ginge weiss ich auch noch nicht ?(

    BLinz

  • Anfänger sucht mal bissel hilfe.

    • BLinz
    • 20. November 2011 um 19:44

    Hallo anoriel,

    wie du schreibst hast du dir die Hilfe/Beschreibung für MouseClick aus dem Internet gesucht?

    Ich persönlich würde dir empfehlen, wenn du es nicht schon getan hast, nach der Installation von AutoIt den SciTE Editor zu installieren.
    Nun kannst du in SciteTE, was ein an AutoIt angepasster Texteditor ist, einfach F1 drücken und es öffnet sich ein Fenster in dem der Befehl erklärt wird.
    Zudem steht unter jedem Befehl mindestens ein Beispiel.

    Wenn du dir dann die deutsche Version dieser Hilfe Datei herunterlädst - Tja dann hast du alles in Deutsch!

    Und das beste - das alles bekommts du wenn du ein wenig nach links schaust - und den Kasten "Downloads" findest.

    Auch ich nutze ständig diese Hilfe - um nochmal den Aufruf nach zu sehen oder was die Funnktion eigentlich zurück meldet.

    Unter "Wichtige Links", auch auf der linken Seite, findest du auch das "AutoIt-Tutorial" womit du einen Einstieg in AutoIt bekommen kannst

    BLinz

  • Augen folgen Maus (Beispiel)

    • BLinz
    • 20. November 2011 um 19:34

    :P Da erwarten man 2 Augen die der Maus folgen .... und dann diese Augen-Attacke !!!

    1a das Beispiel! Kam sofort in meinen "Wie geht eigentlich..." Ordner

    Danke!

  • _ChooseFont ohne Schriftgrad, größe und Farbe aufrufen

    • BLinz
    • 20. November 2011 um 10:19

    *g* Ich kannte dafür die DLL Methode nicht .....

  • Schleifen behaken sich

    • BLinz
    • 20. November 2011 um 10:15

    Moin,

    entweder nutzt du Opt("GUIOnEventMode", 1) oder nicht

    schmeiss die schleifen raus - du brauchst nur eine globale

    Spoiler anzeigen

    While 1
    WEnd

    und dann arbeitest du mit GUICtrlSetOnEvent.

    Oder - du arbeitest klassisch und verwendest Select Case - aber das mischen der Formen ist mist

  • Installation von MS SQL Express 2008 R2 (x64) - geht nix... AutoIT kriegt nix mit...

    • BLinz
    • 19. November 2011 um 17:14

    Wenn du kannst das ganze auch mit einem Einzeiler installieren,

    schau dir dazu die Hilfe von msiexec an - (Start - ausführen - "msiexec /?")

    mit /quiet bekommst du eine unbeaufsichtige Installation

    schau z.b. hier: http://blogs.msdn.com/b/astebner/arc…/29/610435.aspx
    oder hier, die Schalter stehen weiter unten - ist zwar für 2005, sollte aber noch passen: http://msdn.microsoft.com/en-us/library/…54(SQL.90).aspx

    BLinz

  • Gültigkeit von Inputboxeingabe checken

    • BLinz
    • 19. November 2011 um 17:03

    Noch mal geändert:

    RegEx verkürzt und - gemäß meines eigenen Mantras - mit Kommentaren versehen:

    Spoiler anzeigen
    [autoit]


    $emailinput = InputBox("Emailadresse eigeben","Adresse:","admin@znil.de")

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

    ;$emailgeprueft enthält 1 wenn eine Emailadresse gefunden wurde,
    ; Alternativ mal die anderen StringRegExp Parameter in der Hilfe ansehen - der kann auch ein Array mit den Adressen zurück geben etc.
    $emailgeprueft = StringRegExp($emailinput,"(?i)[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}")
    ; (?i) = Groß/Kleinschreibung ignorieren
    ;[A-Z0-9._%+-]+ = Finde etwas das die folgenden Zeichen enthält ...
    ; [A-Z = Buchstaben und / oder
    ; 0-9 = Zahlen und / oder
    ; ._% = Punkt, Unterstrich und / oder %
    ; +-] = Plus und/oder Minus
    ; + = (Hinter dem ]) in beliebiger Anzahl / Länge
    ; @ = auf jeden Fall ein @
    ;[A-Z0-9.-]+ = Wie zuvor, jedoch kein _ oder % (nicht erlaubt im Domänenteil
    ;\. = Auf jeden Fall mindestens einen Punkt
    ;[A-Z]{2,6} = Buchstaben, mindestens 2, maximal 6 = Domänenendung wie .com oder .de
    ; für die neuen Endungen wie .hamburg etc. müsste man den Wert erhöhen
    If $emailgeprueft = 1 Then
    MsgBox(0,"Erfolgreich",$emailinput & " ist eine gültige Adresse")
    Else
    MsgBox(16,"Fehler",$emailinput & " ist keine Emailadresse")
    EndIf

    [/autoit]
  • Gültigkeit von Inputboxeingabe checken

    • BLinz
    • 19. November 2011 um 15:21

    Hier ein Beispiel mit StringRegEx

    [autoit]


    $emailinput = InputBox("Emailadresse eigeben","Adresse:","admin@znil.de")

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

    ;$emailgeprueft enthält 1 wenn eine Emailadresse gefunden wurde,
    ; Alternativ mal die anderen StringRegExp Parameter in der Hilfe ansehen - der kann auch ein Array mit den Adressen zurück geben etc.
    $emailgeprueft = StringRegExp($emailinput,"(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b")

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

    If $emailgeprueft = 1 Then
    MsgBox(0,"Erfolgreich",$emailinput & " ist eine gültige Adresse")
    Else
    MsgBox(16,"Fehler",$emailinput & " ist keine Emailadresse")
    EndIf

    [/autoit]
  • _Stringbetween()

    • BLinz
    • 19. November 2011 um 15:06
    Zitat

    PS: Würde anstatt der For-Schleife einfach _ArrayDisplay() benutzen

    Ja ... aber das muss er auch die Array.au3 includen :) so geht es ohne.
    Er hätte natürlich alles erst in einen String schreiben können und dann in eins veröffentlichen. Aber für eine Demonstration der Funktion war es doch einfach perfekt :)

  • _ChooseFont ohne Schriftgrad, größe und Farbe aufrufen

    • BLinz
    • 19. November 2011 um 15:01

    Moin,

    ich poste hier mal den Schnippsel aus einem meiner Programme wo ich genau das machen - eine Listbox wo der Benutzer nur die Schriftart wählen darf,
    habs nur schnell zusammenkopiert und eine Demo umzugebaut - bitte nicht auf Schönheit schauen aber es funzt:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <StaticConstants.au3>

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

    #Region ### START Koda GUI section ### Form=C:\_AutoIT\AutoIt.de\DemoSchrifetnauswahlForm1.kxf
    $Form1 = GUICreate("Form1", 615, 455, 607, 124)
    $ListSchriftenauswahl = GUICtrlCreateList("", 96, 32, 409, 344)
    $Label1 = GUICtrlCreateLabel("Dies ist ein Test-Text", 96, 400, 300, 28)
    GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ;Schrifarten zusammenstellen
    Dim $sAllFonts = @CRLF
    Dim $setschleife = 1
    Dim $sFont, $tempsetSchriftart
    While True
    $sFont = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", $setschleife)
    If @error Then ExitLoop
    $setschleife = $setschleife + 1
    $sAllFonts &= $sFont & @CRLF
    WEnd

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

    $aTrueType = StringRegExp($sAllFonts, '(.+?\(TrueType\))\r', 3)
    _ArraySort($aTrueType)
    _GUICtrlListBox_BeginUpdate($ListSchriftenauswahl)
    For $i = 0 To UBound($aTrueType) - 1
    _GUICtrlListBox_AddString($ListSchriftenauswahl, StringReplace($aTrueType[$i], " (TrueType)", ""))
    Next
    _GUICtrlListBox_EndUpdate($ListSchriftenauswahl)
    _GUICtrlListBox_SelectString($ListSchriftenauswahl, $tempsetSchriftart)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ListSchriftenauswahl
    $tempsetSchriftart = GUICtrlRead($ListSchriftenauswahl)
    GUICtrlSetFont($Label1, 14, 400, 0, $tempsetSchriftart)
    EndSwitch
    WEnd

    [/autoit]

    Die Schriften werden aus der Registry gelesen - und es wird auf TrueType Fonst gefiltert. Ganz ohne DLL aufrufe.
    Die Methode hatte ich selbst irgendwo gefunden (wahrscheinlich sogar in diesem Forum)

  • GUICtrlSetData mit GUICtrlRead auslesen

    • BLinz
    • 18. November 2011 um 11:59

    mhh sieht kompliziert aus aber ich erkennnicht das RegEx Problem... passen denn die letzten Zeilen in den CSV Dateien?

  • Schon wieder FTP Problem

    • BLinz
    • 18. November 2011 um 11:49

    siehe chips Post weiter oben -

    schaue einmal in die Hilfe (Cursor in Scite auf den Befehl _FTP_ProgressUpload und dann F1

  • Happy Birthday Techmix

    • BLinz
    • 18. November 2011 um 11:47

    Auch einen Glückwunsch von mir!

  • #RequireAdmin und runaswait

    • BLinz
    • 18. November 2011 um 00:11

    Moin,

    die Lösung hast du da quasi stehen - du startest im 2. Skript mit runaswait als Admin (= mit Adminrechten)
    dann lass doch das "#RequireAdmin" weg - das brauchst du dann ja eben nicht (und das löst die UAC aus)

    Du startest IN deinem Skript etwas mit Adminrechten - aber dein Skript selbst braucht keine.

    BLinz

  • Schon wieder FTP Problem

    • BLinz
    • 17. November 2011 um 23:55

    Also dein _FTP_ProgressUpload Aufruf sieht falsch aus ...

    aber

    Bitte bearbeite deinen ersten Eintrag und kopiere den Quellcode nochmal neu rein ... es ist so durcheinander das ich die Sachen nicht sauber trennen kann

  • [Beispiel] - Benutzer einen beliebigen Hotkey auswählen lassen

    • BLinz
    • 17. November 2011 um 16:27

    Noch ein Update (Fehler in Überprüfung gefunden).

  • Inhalt eines Editfeldes Drucken lassen

    • BLinz
    • 17. November 2011 um 16:17

    Den FilePrint Aufruf wie folgt ersetzen:

    [autoit]

    ShellExecute("wordpad.exe","/p " & @TempDir & "\temp.txt") ;- sichtbar

    [/autoit]

    oder wenn Worpad unsichtbar starten soll:

    [autoit]

    ShellExecute("wordpad.exe","/p " & @TempDir & "\temp.txt","","",@SW_HIDE ) ;- unsichtbar

    [/autoit]
  • Youtube API - Login Beispiel ?

    • BLinz
    • 17. November 2011 um 16:09

    Schaust du hier? [ neu ] IE Youtube API

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™