Maximiertes Fenster herunterziehen wie bei Win7 für XP und Vista

  • Mal wieder ein kleines Hilfs-Skript von mir.
    Einfach ein maximiertes Fenster an der Titelleiste anklicken und herunterziehen um es wiederherzustellen, bzw. ein nicht maximiertes Fenster einfach nach oben schieben um es zu maximieren.
    Ebenfalls kann man das Fenster nach rechts oder links schieben, um es auf genau der Hälfte des Bildschirmes anzuzeigen.

    Neuerung:
    [Win]+[Pfeil oben] Fenster maximieren
    [Win]+[Pfeil unten] Fenster minimieren
    [Win]+[Pfeil links] auf halbe Monitorbreite maximiert, linksbündig
    [Win]+[Pfeil rechts] auf halbe Monitorbreite maximiert, rechtsbündig


    Viel Spaß!

    Spoiler anzeigen
    [autoit]

    ;#NoTrayIcon
    #include <Misc.au3>
    #include <WinAPI.au3>
    #include <Constants.au3>

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

    Opt("WinWaitDelay", 0)

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

    If @OSBuild > 6800 Then
    MsgBox(64, "Info", "You don't need to run this script. It is already a build in behavior of your Windows.")
    Exit
    EndIf

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

    #region Setting
    Global $With_Preview = 1
    HotKeySet("{Esc}", "_Exit")
    #endregion Setting

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

    HotKeySet("#{up}", "_up")
    HotKeySet("#{down}", "_down")
    HotKeySet("#{left}", "_left")
    HotKeySet("#{right}", "_right")

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

    Global $dll = DllOpen("user32.dll")
    Global $hwnd, $MousePos[2], $MousePos_old[2], $aPos
    Global $y = _WinAPI_GetSystemMetrics(31)
    Global $VirtualDesktopWidth = _WinAPI_GetSystemMetrics(78)
    Global $VirtualDesktopHeight = _WinAPI_GetSystemMetrics(79)
    Global $TaskBarHeight = WinGetPos("[Class:Shell_TrayWnd]")
    $TaskBarHeight = @DesktopHeight - $TaskBarHeight[1]

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

    If $With_Preview Then
    Global $hGui = GUICreate("Preview", @DesktopWidth, @DesktopHeight - $TaskBarHeight, 0, 0, 0x80000000, 0x000800A9)
    GUISetBkColor(0xABCDEF)
    _WinAPI_SetLayeredWindowAttributes($hGui, 0xABCDEF, 255)
    EndIf

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

    While 1
    Sleep(10)
    If _IsPressed(01, $dll) Then
    $hwnd = WinActive("")
    $MousePos = MouseGetPos()
    If Not _IsSizeable($hwnd) Then
    ElseIf $MousePos[1] < $y And $MousePos_old[1] < $MousePos[1] Then ;RESTORE
    If WinGetState($hwnd) = 47 Then
    Do
    Sleep(10)
    $MousePos = MouseGetPos()
    Until $MousePos[1] > $y
    If _IsPressed(01, $dll) Then
    WinSetState($hwnd, "", @SW_RESTORE)
    $MousePos = MouseGetPos()
    $aPos = WinGetPos($hwnd)
    WinMove($hwnd, "", $MousePos[0] - $aPos[2] / 2, $MousePos[1] - $y / 2)
    MouseUp("primary")
    MouseDown("primary")
    EndIf
    EndIf
    ElseIf $MousePos[1] = 0 And $MousePos_old[1] > 0 Then ;MAXIMIZE
    If WinGetState($hwnd) = 15 Then
    If $With_Preview Then
    If $MousePos[0] > @DesktopWidth Then
    WinMove($hGui, "", @DesktopWidth, 0, $VirtualDesktopWidth - @DesktopWidth, @DesktopHeight)
    Else
    WinMove($hGui, "", 0, 0, @DesktopWidth, @DesktopHeight - $TaskBarHeight)
    EndIf
    GUISetState(@SW_SHOWNOACTIVATE, $hGui)
    EndIf
    While 1
    Sleep(10)
    $MousePos = MouseGetPos()
    If $MousePos[1] > 0 Then
    If $With_Preview Then
    GUISetState(@SW_HIDE, $hGui)
    EndIf
    ExitLoop
    ElseIf Not _IsPressed(01) Then
    WinSetState($hwnd, "", @SW_MAXIMIZE)
    If $With_Preview Then GUISetState(@SW_HIDE, $hGui)
    ExitLoop
    EndIf
    WEnd
    EndIf
    ElseIf $MousePos[0] = 0 And $MousePos_old[0] > 0 Then ;LEFT HALF
    If WinGetState($hwnd) = 15 Then
    If $With_Preview Then
    WinMove($hGui, "", 0, 0, @DesktopWidth / 2, @DesktopHeight - $TaskBarHeight)
    GUISetState(@SW_SHOWNOACTIVATE, $hGui)
    EndIf
    While 1
    Sleep(10)
    $MousePos = MouseGetPos()
    If $MousePos[0] > 0 Then
    If $With_Preview Then
    GUISetState(@SW_HIDE, $hGui)
    EndIf
    ExitLoop
    ElseIf Not _IsPressed(01) Then
    WinMove($hwnd, "", 0, 0, @DesktopWidth / 2, @DesktopHeight - $TaskBarHeight)
    If $With_Preview Then GUISetState(@SW_HIDE, $hGui)
    ExitLoop
    EndIf
    WEnd
    EndIf
    ElseIf $MousePos[0] = $VirtualDesktopWidth - 1 And $MousePos_old[0] < $VirtualDesktopWidth - 1 Then ;RIGHT HALF
    If WinGetState($hwnd) = 15 Then
    If $With_Preview Then
    WinMove($hGui, "", @DesktopWidth / 2, 0, @DesktopWidth / 2, @DesktopHeight - $TaskBarHeight)
    GUISetState(@SW_SHOWNOACTIVATE, $hGui)
    EndIf
    While 1
    Sleep(10)
    $MousePos = MouseGetPos()
    If $MousePos[0] < $VirtualDesktopWidth - 1 Then
    If $With_Preview Then
    GUISetState(@SW_HIDE, $hGui)
    EndIf
    ExitLoop
    ElseIf Not _IsPressed(01) Then
    WinMove($hwnd, "", @DesktopWidth / 2, 0, @DesktopWidth / 2, @DesktopHeight - $TaskBarHeight)
    If $With_Preview Then GUISetState(@SW_HIDE, $hGui)
    ExitLoop
    EndIf
    WEnd
    EndIf
    EndIf
    $MousePos_old = $MousePos
    EndIf
    WEnd

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _Up()
    Local $WinHandle = WinActive("")
    If Not _IsSizeable($WinHandle) Then Return
    WinSetState($WinHandle, "", @SW_MAXIMIZE)
    EndFunc

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

    Func _Down()
    Local $WinHandle = WinActive("")
    If Not _IsSizeable($WinHandle) Then Return
    If WinGetState($WinHandle) = 47 Then
    WinSetState($WinHandle, "", @SW_RESTORE)
    Else
    WinSetState($WinHandle, "", @SW_MINIMIZE)
    EndIf
    EndFunc

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

    Func _Left()
    Local $WinHandle = WinActive("")
    If Not _IsSizeable($WinHandle) Then Return
    Local $WinPos = WinGetPos($WinHandle)
    If $VirtualDesktopWidth = @DesktopWidth Or $WinPos[0] + $WinPos[2]/2 < @DesktopWidth Then
    WinSetState($WinHandle, "", @SW_RESTORE)
    WinMove($WinHandle, "", 0, 0, @DesktopWidth / 2, @DesktopHeight - $TaskBarHeight)
    Else
    WinSetState($WinHandle, "", @SW_RESTORE)
    WinMove($WinHandle, "", @DesktopWidth, 0, @DesktopWidth / 2, @DesktopHeight)
    EndIf
    EndFunc

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

    Func _Right()
    Local $WinHandle = WinActive("")
    If Not _IsSizeable($WinHandle) Then Return
    Local $WinPos = WinGetPos($WinHandle)
    If $VirtualDesktopWidth = @DesktopWidth Or $WinPos[0] + $WinPos[2]/2 < @DesktopWidth Then
    WinSetState($WinHandle, "", @SW_RESTORE)
    WinMove($WinHandle, "", @DesktopWidth / 2, 0, @DesktopWidth / 2, @DesktopHeight - $TaskBarHeight)
    Else
    WinSetState($WinHandle, "", @SW_RESTORE)
    WinMove($WinHandle, "", $VirtualDesktopWidth - @DesktopWidth / 2, 0, @DesktopWidth / 2, @DesktopHeight)
    EndIf
    EndFunc

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

    Func _IsSizeable($hWnd)
    Local $Style = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hwnd, "long", -16) ;$GWL_STYLE
    If @error Then
    Return 0
    Else
    Return BitAND($Style[0], 0x00040000) > 0
    EndIf
    EndFunc

    [/autoit]
  • Sehr schöner Effekt. Wer schon TrueTransparency nutzt, benötigt dieses Tool aber nicht wenn ich mich recht erinnere ;)

    • Offizieller Beitrag

    Habe WinXP und sehe mich mal wieder bestätigt, dass Win7 wohl eher etwas für Grafikenthusiasten und Effektliebhaber ist. OK, wer es mag. :rolleyes:

    Einfach ein maximiertes Fenster an der Titelleiste anklicken und herunterziehen um es wiederherzustellen, bzw. ein nicht maximiertes Fenster einfach nach oben schieben um es zu maximieren.

    Funktioniert (aber ein Klick auf "Verkleinern/Maximieren" bewirkt doch dasselbe und geht schneller).

    Ebenfalls kann man das Fenster nach rechts oder links schieben, um es auf genau der Hälfte des Bildschirmes anzuzeigen.

    Da regt sich auf meinem PC gar nix, aber kein Problem, da ich kein Freund von Effekten bin.
    @fukey: Nicht dass du mich mißverstehst, ich möchte deine Leistung nicht schmälern. Ich bin wohl einfach zu alt für solche Gimmicks. :D
    Meine PC's bekommen immer das Klassik-Design und wo es irgend geht verzichte ich eh auf Mausklickerei, Tastatur ist da weitaus schneller. ;)