Fenster Halbieren á la Windows 7

  • Hallo Leute,
    da mein Bruder seit ich GTA IV hab am Desktop-PC zockt, und ich nicht am iPhone surfen wollte, habe ich meinen Laptop ausgekramt. Dieser jedoch hat "nur" Windows XP, und da gibt es diese nützliche "halbieren-Funktion" (ihr zieht in Windows 7 ein fenster an die rechte oder linke Bildschirmseite) nicht.

    So habe ich auf die schnelle so eine Funktion gecodet.
    Fenster-Bedienung:
    WIN + LINKE-PFEILTASTE -> Fenster wird links angebracht
    WIN + RECHTE-PFEILTASTE -> Fenster wird rechts angebracht
    WIN + OBEN-PFEILTASTE -> Fenster wird maximiert

    Nur unter Win XP getestet, 32 bit, bei mir läuft dsa wirklich gut un der Effekt ist wie Windows 7, gefällt mir ganz gut mein Werk :D

    Lange Rede kurzer Sinn, hier das Script:

    Code
    [autoit]


    #include <Misc.au3>
    ProcessSetPriority("AutoIt3.exe", 0)
    ProcessSetPriority("AutoIt3_x64.exe", 0)
    Global $activeWindows
    While 1
    Sleep(100)
    If _IsPressed("5B") And _IsPressed("25") Then
    WinMove("[ACTIVE]", "", 0, 0, @DesktopWidth / 2, @DesktopHeight - _Taskbar("Hoch"))
    EndIf
    If _IsPressed("5B") And _IsPressed("27") Then
    WinMove("[ACTIVE]", "", @DesktopWidth / 2, 0, @DesktopWidth / 2, @DesktopHeight - _Taskbar("Hoch"))
    EndIf
    If _IsPressed("5B") And _IsPressed("26") Then
    WinSetState("[ACTIVE]","", @SW_MAXIMIZE)
    EndIf
    WEnd

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

    Func _Taskbar($Art)
    Local $value = Opt("WinTitleMatchMode", 4)
    Local $Pos = WinGetPos("classname=Shell_TrayWnd")
    Opt("WinTitleMatchMode", $value)
    If $Art = "Hoch" Then
    Return $Pos[3]
    ElseIf $Art = "Breit" Then
    Return $Pos[2]
    EndIf
    EndFunc ;==>_Taskbar

    [/autoit]

    Um die Höhe der Taskleiste zu bekommen habe ich eine Funktion von autoBert genommen, original Funktion hier zu finden: Funktion

    MfG

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

    2 Mal editiert, zuletzt von Mattthias (31. Dezember 2011 um 10:57)

  • Oh, wsste ich nicht ...
    Was sind denn die Windows Linke Pfeiltaste ???
    WINDOWS + LINKE-PFEILTASTE oder wie ?

    Dennoch, zum script selbst (und funktion) noch ne anmerkung ?
    :D

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • kannst doch trotzdem testen ?
    oder funzt es unter win 7 net ?
    wenn ich in 30 min wieder am pc bin test ichs auch ;)

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Das Skript verbraucht 1/Kernanzahl CPU.
    Damit wird der PC nicht nur langsam, sondern er verbraucht auch noch unnötig unmengen Strom.
    Die Funktionalität ist allerdings gegeben....

    lg
    M

  • :D
    Na gut, dann ändern wir das doch einfach ...

    [autoit]


    #include <Misc.au3>
    ProcessSetPriority("AutoIt3.exe", 0)
    ProcessSetPriority("AutoIt3_x64.exe", 0)
    Global $activeWindows
    While 1
    Sleep(100)
    If _IsPressed("11") And _IsPressed("4C") Then
    WinMove("[ACTIVE]", "", 0, 0, @DesktopWidth / 2, @DesktopHeight - _Taskbar("Hoch"))
    EndIf
    If _IsPressed("11") And _IsPressed("52") Then
    WinMove("[ACTIVE]", "", @DesktopWidth / 2, 0, @DesktopWidth / 2, @DesktopHeight - _Taskbar("Hoch"))
    EndIf
    WEnd

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

    Func _Taskbar($Art)
    Local $value = Opt("WinTitleMatchMode", 4)
    Local $Pos = WinGetPos("classname=Shell_TrayWnd")
    Opt("WinTitleMatchMode", $value)
    If $Art = "Hoch" Then
    Return $Pos[3]
    ElseIf $Art = "Breit" Then
    Return $Pos[2]
    EndIf
    EndFunc ;==>_Taskbar

    [/autoit]

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • funz bei mir win XP nicht bzw. hat spontan kurz funktioniert jetzt bring ich's nicht mehr zum laufen
    zudem war es vertauscht

    WIN + LINKE-PFEILTASTE -> Fenster wird rechts angebracht
    WIN + RECHTE-PFEILTASTE -> Fenster wird links angebracht
    WIN + OBEN-PFEILTASTE -> Funktionslos

  • Da ich meistens immer die Maus benutze um die Fenster zu verschieben hab ich mal eine kleine Ergänzung geschrieben.

    Der ganze Spaß kommt mit EINER _IsPressed Abfrage pro Durchlauf aus. Und nur, wenn die linke Maustaste losgelassen wurde wird überprüft wo die Maus eigentlich ist. Wie sowas mit einem Mouseevent geht weiß ich nicht, aber das müsste schon hart am Optimum sein...

    Spoiler anzeigen
    [autoit]


    Opt('MouseCoordMode', 1)

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

    Global Const $B = @DesktopWidth
    Global Const $H = @DesktopHeight
    Global Const $U = _Taskbar('Hoch')
    Global $h_USER32_DLL = DllOpen('USER32.DLL')

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

    _Main()

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

    DllClose($h_USER32_DLL)
    Exit

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

    Func _Main()
    Local $aMPos[2], $L_DOWN, $L_UP = $L_DOWN, $L_DOWN_ALT
    While Sleep(50)
    $L_DOWN = _IsPressed('01')
    $L_UP = False
    If (Not $L_DOWN) And $L_DOWN_ALT Then $L_UP = True
    $L_DOWN_ALT = $L_DOWN
    If $L_UP Then
    $aMPos = MouseGetPos()
    If $aMPos[0] < 2 Then
    WinMove('[ACTIVE]', '', 0, 0, $B / 2, $H - $U)
    ElseIf $aMPos[0] > $B - 3 Then
    WinMove('[ACTIVE]', '', $B / 2, 0, $B / 2, $H - $U)
    ElseIf $aMPos[1] < 2 Then
    WinMove('[ACTIVE]', '', 0, 0, $B, $H - $U)
    EndIf
    EndIf
    WEnd
    EndFunc ;==>_Main

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

    Func _Taskbar($Art)
    Local $value = Opt('WinTitleMatchMode', 4)
    Local $Pos = WinGetPos('classname=Shell_TrayWnd')
    Opt('WinTitleMatchMode', $value)
    If $Art = 'Hoch' Then
    Return $Pos[3]
    ElseIf $Art = 'Breit' Then
    Return $Pos[2]
    EndIf
    EndFunc ;==>_Taskbar

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

    Func _IsPressed($sHexKey)
    Local $a_R = DllCall($h_USER32_DLL, 'short', 'GetAsyncKeyState', 'int', '0x' & $sHexKey)
    Return BitAND($a_R[0], 0x8000) <> 0
    EndFunc ;==>_IsPressed

    [/autoit]

    lg
    M

  • Code vom Marsi funktioniert gut jedoch natürlich nur auf dem ersten Bildschirm

    was zur folge hat das jedes fenster auf bildschirm 2 nicht mehr verschoben werden darf sonst zack is es am Rand von Bildschirm 1^^

    Das Fenster kann nicht zurück gezogen werden bzw .es hat dann nicht mehr die ursprüngliche Grösse wie das in Win7 der Fall ist und das ganze erst richtig praktisch macht =)

  • @Marsi, wenn mir bei meinem Laptop nicht die Shift Taste fehlen würde würde ich da auch besser coden ....

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Boah... war mehr Arbeit als ich dachte...
    Jetzt müsste beim Wegziehen von der Beildschirmseite (oder Decke) das Fenster wieder in die Ursprungsgröße versetzt werden.

    Spoiler anzeigen
    [autoit]


    Opt('MouseCoordMode', 1)

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

    Global Const $DB = @DesktopWidth
    Global Const $DH = @DesktopHeight
    Global Const $U = _Taskbar('Hoch')
    Global $h_USER32_DLL = DllOpen('USER32.DLL')
    Global $Fenster[1][6]

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

    _Main()

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

    DllClose($h_USER32_DLL)
    Exit

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

    Func _Main()
    Local $aMPos[2], $L_DOWN, $L_UP = $L_DOWN, $L_DOWN_ALT
    While Sleep(50)
    $L_DOWN = _IsPressed('01')
    $L_UP = False
    If (Not $L_DOWN) And $L_DOWN_ALT Then $L_UP = True
    $L_DOWN_ALT = $L_DOWN
    If $L_UP Then
    $aMPos = MouseGetPos()
    If $aMPos[1] < $DH - $U Then
    If $aMPos[0] < 2 Then
    Resize($aMPos, 0, 0, $DB / 2, $DH - $U)
    ElseIf $aMPos[0] > $DB - 3 Then
    Resize($aMPos, $DB / 2, 0, $DB / 2, $DH - $U)
    ElseIf $aMPos[1] < 2 Then
    Resize($aMPos, 0, 0, $DB, $DH - $U, True)
    Else
    Resize($aMPos)
    EndIf
    EndIf
    EndIf
    WEnd
    EndFunc ;==>_Main

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

    Func Resize($aMPos, $x = 0, $y = 0, $b = 0, $h = 0, $Oben = False)
    Local $hWnd = WinGetHandle('[ACTIVE]'), $i, $info
    If $hWnd Then
    $i = _InArray($hWnd)
    If $i Then
    $info = WinGetPos($Fenster[$i][0])
    If _Kollision_Viereck_Punkt($aMPos[0], $aMPos[1], $info[0], $info[1], $info[2], 25) Then
    If $Fenster[$i][5] Then
    $x = $aMPos[0] - $Fenster[$i][3] / 2
    $y = $aMPos[1] - $Fenster[$i][2]
    Else
    $x = $info[0]
    $y = $info[1]
    EndIf
    $b = $Fenster[$i][3]
    $h = $Fenster[$i][4]
    If $x < 0 Then $x = 0
    If $y < 0 Then $y = 0
    If $x + $b > $DB Then $x = $DB - $b
    WinMove($Fenster[$i][0], '', $x, $y, $b, $h)
    _ArrayDelete2($Fenster, $i)
    EndIf
    ElseIf ($x <> 0) Or ($y <> 0) Or ($b <> 0) Or ($h <> 0) Then
    $info = WinGetPos($hWnd)
    $i = UBound($Fenster)
    ReDim $Fenster[$i + 1][6]
    $Fenster[$i][0] = $hWnd
    $Fenster[$i][1] = $aMPos[0] - $info[0]
    $Fenster[$i][2] = $aMPos[1] - $info[1]
    $Fenster[$i][3] = $info[2]
    $Fenster[$i][4] = $info[3]
    $Fenster[$i][5] = $Oben
    WinMove($hWnd, '', $x, $y, $b, $h)
    EndIf
    EndIf
    EndFunc ;==>Resize

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

    Func _Kollision_Viereck_Punkt($x1, $y1, $X2, $Y2, $b2, $h2)
    Return ($x1 > $X2 And $y1 > $Y2 And $x1 < $X2 + $b2 And $y1 < $Y2 + $h2)
    EndFunc ;==>_Kollision_Viereck_Punkt

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

    Func _ArrayDelete2(ByRef $a, $e)
    Local $U = UBound($a, 1) - 1, $s = UBound($a, 2) - 1
    For $i = $e To $U - 1 Step 1
    For $j = 0 To $s Step 1
    $a[$i][$j] = $a[$i + 1][$j]
    Next
    Next
    ReDim $a[$U][$s + 1]
    EndFunc ;==>_ArrayDelete2

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

    Func _InArray($hWnd)
    For $i = 1 To UBound($Fenster) - 1 Step 1
    If $Fenster[$i][0] = $hWnd Then Return $i
    Next
    Return False
    EndFunc ;==>_InArray

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

    Func _Taskbar($Art)
    Local $value = Opt('WinTitleMatchMode', 4)
    Local $Pos = WinGetPos('classname=Shell_TrayWnd')
    Opt('WinTitleMatchMode', $value)
    If $Art = 'Hoch' Then
    Return $Pos[3]
    ElseIf $Art = 'Breit' Then
    Return $Pos[2]
    EndIf
    EndFunc ;==>_Taskbar

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

    Func _IsPressed($sHexKey)
    Local $a_R = DllCall($h_USER32_DLL, 'short', 'GetAsyncKeyState', 'int', '0x' & $sHexKey)
    Return BitAND($a_R[0], 0x8000) <> 0
    EndFunc ;==>_IsPressed

    [/autoit]


    @Mattthias: Das mit dem vergessenen Sleep war schon ein grober Schnitzer^^
    ansonsten freut es mich, dass du auf so Ideen kommst. Sonst hätte ich die ganze Zeit während ich auf meine OGame Flotte warte nix zu tun gehabt :P

    //Edit: BugFix: Wenn die Startschaltfläche geklickt wurde, wurde das Startmenu manchmal teilweise verschoben.//

    lg
    M

  • Ahhso ;D
    Ja, ich finde die Funktion einfach wirklich sehr sehr nützlich, habe in meinem Script jetzt auch alle sachen reingenommen á la Windows 7, also, mit WIN + Pfeiltasten ;
    Aber schön wenn du dich damit beschäftigt hast, ich hätte das auch gemacht, aber dass das viel arbeit wär ist mir klar ;D
    Dennoch glaube ich dass du n paar zeilen hättest sparen können, aber ich test das ma früher oder später an meinem Laptop ;D

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal