Deutsches AutoHotkey Homepage AutoHotkey Community
Wir helfen uns gegenseitig aus der Patsche
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Aktives Fenster auf mehreren Bildschirmen optimieren

 
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Skripte & Funktionen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
halweg



Anmeldedatum: 05.01.2006
Beiträge: 782
Wohnort: Dresden

BeitragVerfasst am: Do Jan 25, 2007 10:19 am    Titel: Aktives Fenster auf mehreren Bildschirmen optimieren Antworten mit Zitat

Da ich inzwischen einen zweiten 24" Bildschirm habe, wurde es an der Zeit, mein hier bereits vor längerem vorgestelltes Fenster-Optimierungsskript zu erweitern.
Nun kann man damit das aktive Fenster nicht nur auf dem linken oder rechten Bildschirm optimieren, sondern der rechte größere Bildschirm ist in drei "virtuelle" Bereiche aufgeteilt, worin das aktuelle Fenster je nach aktueller Mausposition reingestellt wird.
So ist es leicht möglich, zwei oder drei Textbearbeitungsfenster nebeneinander zu positionieren.
Unverändert bliebt die Optimierung der Explorerfenster, die je nach Inhalt größenoptimiert werden und dann unter der aktuellen Mausposition plaziert werden. Dieser Teil des Skripts nimmt den meisten Code ein.
Um eine Nachnutzung des Skripts zu erleichtern, habe ich alle spezifischen Werte meiner Bildschirmkonstellation auf Variablen gelegt. Das Nachmessen der eigenen Bildschirmkonstellation und die Angabe der "Wunschpositionen" der virtuellen Fensterbereiche muss aber jeder selbst tun. Prinzipiell kann man beliebig viele solche Bereiche definieren.
Code:
;
; AutoHotkey Version: 1.0.46.05
; Language:       Deutsch
; Platform:       WinXP
; Author:         Halweg
;
; Nachfolgend ein Script zur Optimierung der Fensterposition und -größe bei großen Bildschirmflächen.
; Es empfielt sich, statt F4 eine zusätzliche Maustaste mit dem Skript zu belegen (zum Beispiel Doppelklick Mitteltaste).
; Das Skript muss für die jeweils eigene Konfiguration bzgl. der Pixelwerte der genutzen Bildschirme angepasst werden.
;
; Das hier gezeigte Beispiel ist für eine Zwei-Bildschirm-Kombination eingerichtet:
; 1. Notebook-Bildschirm 15,4 " 1280x800 links (davon 135 Pixel links für Taskleiste reserviert)
; 2. Zusätzlicher Bildschirm 24" 1920x1200 rechts daneben

; Bei Aufruf des Skripts wird die Lage des Mauszeigers bestimmt. Davon abhängig wird das aktuelle Fenster
; in einem der vier Bildschirmbereiche zentriert und in der Größe für diesen Bereich angepasst:
; Bereich 1: linker Bildschirm
; Bereich 2: linke Hälfte rechter Bildschirm
; Bereich 3: Mitte rechter Bildschirm
; Bereich 2: rechte Hälfte rechter Bildschirm
;
; Handelt es sich um ein Explorerfenster, wird die Detailansicht eingestellt und die
; Fenstergröße wird dem Inhalt angepasst (soweit möglich). Die Positionierung des Fensters
; erfolgt so, dass der Mauszeiger anschließend über dem ersten Eintrag in der Dateiliste steht.
;
; Zur Nachnutzung des Skriptes müssten die Variablen wie kommentiert (!Anpassen!) entsprechend
; der eigenen Bildschirmkonstellation neu belegt werden. Grundverständnis in AHK ist dazu erforderlich.

;*** Allgemeine Grund-Einstellungen
#INSTALLKEYBDHOOK
COORDMODE, TOOLTIP, SCREEN  ;*** Place ToolTips at absolute screen coordinates:
COORDMODE, MOUSE, SCREEN    ;*** Mouse Position at absolute screen coordinates:
DETECTHIDDENTEXT, ON
SETTITLEMATCHMODE, 2 ; A window's title can contain WinTitle anywhere inside it to be a match.
GROUPADD, Explorerfenster, AHK_CLASS CabinetWClass
GROUPADD, Explorerfenster, AHK_CLASS ExploreWClassRETURN
RETURN

F4::
  WINRESTORE, A                  ; falls Fenster maximiert dieses demaximieren

;*** Bildschirmbereiche für Maus-Positionsanalyse einstellen
  x_rechts_links = 1280    ;*** wo beginnt der rechte Bildschirm !Anpassen!
  x_rechts_mitte = 2050    ;*** wo beginnt die Mitte des rechten Bildschirms !Anpassen!
  x_rechts_rechts = 2330 ;*** wo beginnt die rechte Seite des rechten Bildschirms !Anpassen!

;*** Parameter für Explorerfenster
  reserve_rechts = 30   ;*** Anzahl Pixel, die rechts neben den Explorerspalten frei bleiben soll
  reserve_unten = 150   ;*** Anzahl der Pixel, die unter der letzten Dateizeile im Explorerfenster frei bleiben soll
  hoehe_min = 200   ;*** Mindesthöhe des Explorerfensters
  hoehe_je_zeile = 17   ;*** Höhe einer Explorerzeile

;*** Parameter für Outlook-Ansicht und andere Fenster, die spezielle Maße haben sollen
  optimale_breite_email = 800
  optimale_breite_kalender = 1120
  breite_activesync = 520
  hoehe_activesync = 340

;*** Ermitteln der Mausposition und Bestimmen der sich daraus ergebenden Fensterkoordinaten
  MOUSEGETPOS, maus_x, maus_y
  IF (maus_x < x_rechts_links)      ;*** Fenster soll auf linken Bildschirm
    {
    x_min = 140      ;*** Minimale linke Fensterposition linker Bildschirm (hier 135 Pixel für Taskbar links) !Anpassen!
    x_max = 1276   ;*** Maximale rechte Fenstergrenze linker Bildschirm  !Anpassen!
    y_min = 0      ;*** Minimale ober Fensterposition linker Bildschirm !Anpassen!
    y_max = 800      ;*** Maximale untere Fenstergrenze linker Bildschirm !Anpassen!
    }
  ELSE IF (maus_x < x_rechts_mitte)   ;*** Fenster soll auf rechten Bildschirm linke Hälfte
    {
    x_min = 1281   ;*** Minimale linke Fensterposition !Anpassen!
    x_max = 2235   ;*** Maximale rechte Fenstergrenze !Anpassen!
    y_min = -352   ;*** Minimale obere Fensterposition !Anpassen!
    y_max = 847      ;*** Maximale untere Fenstergrenze !Anpassen!
    }
  ELSE IF (maus_x < x_rechts_rechts)   ;*** Fenster soll auf rechten Bildschirm Mitte
    {
    x_min = 1600   ;*** Minimale linke Fensterposition !Anpassen!
    x_max = 2855   ;*** Maximale rechte Fenstergrenze !Anpassen!
    y_min = -352   ;*** Minimale obere Fensterposition !Anpassen!
    y_max = 847      ;*** Maximale untere Fenstergrenze !Anpassen!
    }
  ELSE                ;*** Fenster soll auf rechten Bildschirm rechts
    {
    x_min = 2241   ;*** Minimale linke Fensterposition !Anpassen!
    x_max = 3195   ;*** Maximale rechte Fenstergrenze !Anpassen!
    y_min = -352   ;*** Minimale obere Fensterposition !Anpassen!
    y_max = 847      ;*** Maximale untere Fenstergrenze !Anpassen!
    }

;*** Ermitteln der optimalen Fensterwerte 
  x_opt := x_min + 10         ;*** oben etwas Platz lassen
  y_opt := y_min + 50         ;*** links etwas Platz lassen
  breite_opt := x_max - x_min - 30    ;*** nicht horizontal alles ausfüllen
  hoehe_opt := y_max - y_min - 60   ; *** nicht alles vertikal ausfüllen

  IFWINACTIVE, AHK_GROUP Explorerfenster         ;*** Explorerfenster ausmessen und optimieren
    {
    SEND, !ad^{NUMPADADD}               ;*** Details anzeigen und Spaltenbreite optimieren (deutscher Explorer)
    CONTROLGET, n_spalten, LIST, COUNT COL, SysListView321, A   ;*** Anzahl Spalten ermitteln
    CONTROLGET, n_zeilen, LIST, COUNT, SysListView321, A        ;*** Anzahl Zeilen ermitteln
    breite_spalten = 0

    ;*** Zu jeder Spalte mit komischem SENDMESSAGE-Befehl die Breite ermitteln und summieren
    LOOP, %n_spalten%
      {
      akt_spalte := A_INDEX - 1
      SendMessage, 0x1000+29, %akt_spalte%, 0, SysListView321, A
      breite_spalten := breite_spalten + ErrorLevel
      }

    ;*** Ermitteln der Fenstergröße und Position
    breite_soll := breite_spalten + reserve_rechts      ;*** Scrollbalken berücksichtigen
    hoehe_soll := n_zeilen * hoehe_je_zeile + reserve_unten   ;*** Symbolleisten und Reserve berücksichtigen
    hoehe_soll := Max(hoehe_soll,hoehe_min)         ;*** Fenster nicht zu niedrig
    hoehe_soll := Min(hoehe_soll, hoehe_opt)         ;*** Fenster nicht zu hoch
    breite_soll := Min(breite_soll,breite_opt)         ;*** Fenster nicht zu breit
    x_soll := maus_x - 10               ;*** Fensterbeginn etwas links vor der Maus
    y_soll := maus_y - 110                           ;*** Fensterbeginn oben etwas über der Maus
    x_soll := Min(x_soll, x_max - breite_soll)         ;*** Fenster nicht rechts überlappen
    x_soll := Max(x_soll, x_min)            ;*** Fenster nicht links überlappen
    y_soll := Min(y_soll, y_max - hoehe_soll)         ;*** Fenster nicht unten überlappen
    y_soll := Max(y_soll, y_min)            ;*** Fenster nicht oben überlappen
    WINMOVE,  A, , x_soll, y_soll, breite_soll, hoehe_soll
    }
  ELSE IFWINACTIVE, Microsoft ActiveSync         ;*** Active Sync Fenster optimieren (jeweils rechts unten in Fensterbereich)
    WINMOVE, A, , x_max-breite_activesync, y_max-hoehe_activesync
  ELSE                        ;*** Anderes Fenster optimieren
    {
    WINGETTITLE, fenstertitel, A
    ;*** Spezielle Größen für E-Mail und Kalenderfenster einstellen
    IFINSTRING, fenstertitel,- Nachricht, SETENV, breite_opt, % Min(optimale_breite_email,breite_opt)
    IFINSTRING, fenstertitel,Kalender -,  SETENV, breite_opt, % Min(optimale_breite_kalender,breite_opt)
    ;***Fenster optimieren
    WINMOVE, A, , %x_opt%, %y_opt%, %breite_opt%, %hoehe_opt%
    }
RETURN

;*************************** Maximum / Minimum ermitteln *******************
Max(a,b)
{
IFGREATEROREQUAL, a, %b%, RETURN, a
ELSE RETURN b
}

Min(a,b)
{
IFLESSOREQUAL, a, %b%, RETURN, a
ELSE RETURN b
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
denick



Anmeldedatum: 15.09.2006
Beiträge: 1073
Wohnort: Berlin

BeitragVerfasst am: Do Jan 25, 2007 4:24 pm    Titel: Antworten mit Zitat

Moin,

ich habe leider noch keinen zweiten Schirm, so dass ich Dein Skript nicht direkt nutzen kann. Die Sache mit der Manipulation der Explorerfenster gefällt mir aber gut, ich werde mir das mal ausborgen.

Zu den Variablen hätte ich aber noch eine Anregung. Einige dieser Werte kann man doch mit SysGet Aufrufen transparent zum Startzeitpunkt ermitteln. Hättest Du Lust, sowas einzubauen?

Danke! Smile
_________________
Hilfe zur Hilfe

(de)nick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
halweg



Anmeldedatum: 05.01.2006
Beiträge: 782
Wohnort: Dresden

BeitragVerfasst am: Do Jan 25, 2007 4:41 pm    Titel: Antworten mit Zitat

Danke für das Feedback.
denick hat Folgendes geschrieben:
Zu den Variablen hätte ich aber noch eine Anregung. Einige dieser Werte kann man doch mit SysGet Aufrufen transparent zum Startzeitpunkt ermitteln. Hättest Du Lust, sowas einzubauen?

Grundsätzlich eine gute Idee. Allerdings muss der Nutzer immer noch selbst entscheiden, wo genau er seine "virtuellen" Fensterbereiche haben will. Wobei, auch die könnte man dann durch intelligente Fensterteilung ermitteln. Zum Beispiel:
Je nachdem, auf welchen Bildschirmrand ich klicke, wird das Fenster für die obere, untere, linke oder rechte Hälfte des jeweiligen Bildschirms opitmiert. Klicke ich in die MItte des Bildschirms, wird das Fenster in der Mitte optimiert(und auch ein bisschen größer, als bei einer Hälfte). ...

Ok, ich werd mal sehn, wie sich das machen lässt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Skripte & Funktionen Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de