Fenster per Tastenbefehl auf dem Monitor positionieren

Auf einem Großen Monitor will man mehr als ein Fenster sehen. Die Basisfunktionen ab Windows 8 sind grundsätzlich hilfreich, bei einem richtig großen Monitor ist Halbieren jedoch immer noch zu viel des Guten.

Die Lösung liegt – wie immer öfter in den letzten Tagen – in einem Autohotkey-Skript.

Der Ansatz ist ein Gitter in der Anordnung eines Zahleneingabefelds und der Tasten drumherum. Zusätzlich noch # als „Hyperarbeitsplatz-Fenster“. Wenn das Autoscript installiert ist, stehen diese Befehle zur Verfügung, immer eingeleitet mit der Tastenfolge WIN 0 gefolgt von :

Taste Funktion
1 Fenster unten links
2 Fenster unten Mitte
3 Fenster unten rechts
4 Fenster Mitte links
5 Fenster Mitte Mitte
6 Fenster Mitte rechts
7 Fenster oben links
8 Fenster oben Mitte
9 Fenster oben rechts
0 Fenster Mitte Mitte, vergrößert
, Fenster Mitte Mitte, doppelte Höhe
# Fenster Mitte Mitte, doppelt hoch und breit
+ Doppelte Höhe für aktuelles Fenster
- Doppelte Breite für aktuelles Fenster
* Volle Höhe für aktuelles Fenster
/ Halbe Breite für aktuelles Fenster

Damit ist der Bildschirm in ein Raster 6 Felder breit und 3 Felder hoch aufgeteilt, in dem die Fenster per Tastenbefehl einsortiert werden können. Die „doppelt breit“ bzw. „doppelt hoch“-Funktion beachtet die jeweilige Fensterlage. Links wird es nach rechts breiter und umgekehrt, in der Mitte expanidert das Fenster nach links und rechts – weil das praktisch ist. Die Höhe verhält sich analog mit oben und unten, wobei die Mitte nur nach unten expandiert.

Das Skript kann in eine Skript-Bibliothek eingefügt oder in einer Datei mitgeladen werden.

Die Fensterauswahl lässt sich mit Standard-Windows Shortcuts ( ALT TAB und Pfeiltasten) beschleunigen.

Eine nützliche Ergänzung zur freien und dennoch strukturierten Fensteranordnung ist das Programm WindowGrid.


; Fenstersteuerung
; Der BS wird in neun Bereiche aufgeteilt und mit der Tastatur adressiert (1-9), Anordnung wie NUM-Pad
; Trigger ist WIN 0 und dann die Position, alle anderen Eingaben werden ignoriert und das Skript bricht ab

#Numpad0::
#0::
;#WinActivateForce
WinActivate  ; Aktuelles Fenster nehmen
WinGetActiveTitle, Titel
WinRestore, %Titel%
SysGet Mwa, MonitorWorkArea

Input, Lage, L1, {Enter}

; oben links
If (Lage = 7) 
    WinMove, %Titel%, , 0, 0, (MwaRight // 3), (MwaBottom // 3) 
; oben mitte
If (Lage = 8) 
    WinMove, %Titel%, , (MwaRight // 3), 0, (MwaRight // 3), (MwaBottom // 3)
; oben rechts
If (Lage = 9) 
    WinMove, %Titel%, , MwaRight - (MwaRight // 3), 0, (MwaRight // 3), (MwaBottom // 3)
; mitte links
If (Lage = 4) 
    WinMove, %Titel%, , 0, (MwaBottom // 3), (MwaRight // 3), (MwaBottom // 3)
; Mitte Mitte
If (Lage = 5) 
  WinMove, %Titel%, , (MwaRight // 3), (MwaBottom // 3), (MwaRight // 3), (MwaBottom // 3)
; Mitte rechts
If (Lage = 6) 
  WinMove, %Titel%, , MwaRight - (MwaRight // 3), (MwaBottom // 3), (MwaRight // 3), (MwaBottom // 3)
; unten links
If (Lage = 1) 
  WinMove, %Titel%, , 0, MwaBottom - (MwaBottom // 3), (MwaRight // 3), (MwaBottom // 3)
; unten Mitte
If (Lage = 2) 
  WinMove, %Titel%, , (MwaRight // 3), MwaBottom - (MwaBottom // 3), (MwaRight // 3), (MwaBottom // 3)
; unten rechts
If (Lage = 3) 
  WinMove, %Titel%, , MwaRight - (MwaRight // 3), MwaBottom - (MwaBottom // 3), (MwaRight // 3), (MwaBottom // 3)
; Mitte Mitte aber aufgezogen
If (Lage = 0) 
  WinMove, %Titel%, , (MwaRight // 4), (MwaBottom // 4), (MwaRight // 2), (MwaBottom // 2)
; Doppelte Höhe im Raster
If (Lage == "+")
{
    WinGetPos, wx, wy, wb, wh, A
    If (wy < (MwaBottom // 2))
        WinMove, %Titel%, , wx,wy,wb, MwaBottom - (MwaBottom // 3)
    else
     WinMove, %Titel%, , wx, (wy // 2),wb, MwaBottom - (MwaBottom // 3)
}
; Volle Höhe im Raster
If (Lage == "*")
{
    WinGetPos, wx, wy, wb, wh, A
    WinMove, %Titel%, , wx,0,wb, MwaBottom
}
; Halbe Breite im Raster
If (Lage == "/")
{
    WinGetPos, wx, wy, wb, wh, A
      If (wx < (MwaRight // 3))     ; Fenster liegt links, nach links verkleinern
        WinMove, %Titel%, , wx,wy,(wb // 2,wh)
      else
          If (wx < (MwaRight // 2))   ; Fenster liegt in der Mitte (bleibt da, schrumpt zentriert  
                WinMove, %Titel%, ,wx + (wb // 4),wy,(wb // 2),wh
           else    ; Fenster liegt rechts, schrumpft nach rechts
              WinMove, %Titel%, , wx + (wb // 2), wy,(wb // 2),wh
}
; Doppelte Breite im Raster
If (Lage == "-")
{
    WinGetPos, wx, wy, wb, wh, A
    If (wx < (MwaRight // 3))     ; Fenster liegt links, Ausdehnung rechts
        WinMove, %Titel%, , wx,wy,MwaRight - (MwaRight // 3),wh
    else
          If (wx < (MwaRight // 2))   ; Fenster liegt in der Mitte (bleibt da, wird breiter  
                WinMove, %Titel%, , (wx // 2),wy,MwaRight - (MwaRight // 3),wh
           else    ; Fenster liegt rechts, Ausehnung links
              WinMove, %Titel%, , (wx // 2), wy,MwaRight - (MwaRight // 3),wh
}
; Mitte Mitte doppelt hoch
If ((Lage == ",")  OR (Lage == "."))   ; abhängig von Tastatureinstellung beim Numpad
     WinMove, %Titel%, , (MwaRight // 3), (MwaBottom // 3), (MwaRight // 3), 2*(MwaBottom // 3)
; Mitte Mitte doppelt hoch und breit
If (Lage == "#")
    WinMove, %Titel%, , (MwaRight // 6) ,(MwaBottom // 3),(MwaRight // 6)*4,2*(MwaBottom // 3)   
Return

Download der AHK-Datei als ZIP (2kB)