Mehrere (fast) gleiche Fenster identifizieren und anpassen

  • Hallo,

    ich habe ein Problem mit dem Öffnen mehrerer (fast) gleicher Fenster aus ein und demselben Programm heraus.
    Es geht um das hier vielleicht bekannte Bildbearbeitungsprogramm "GIMP".

    1. Ich möchte:
    daß in GIMP alle Bildfenster, die nach dem Öffnen einer Datei aufgemacht werden,
    die gleiche Größe haben und sich an der gleichen Position befinden, sozusagen deckungsgleich sind.

    2. Es soll aber trotzdem möglich sein, Position und Größe jedes der Fenster
    mit Maus und Tastatur zu ändern (also ganz normale Fenstermanipulation).

    3. Laut "AutoIt v3 Window-Info" ist der Titel der Fenster immer verschieden,
    enthält jedoch immer die Zeichenfolge " - GIMP".
    Die Class der Fenster ist immer gleich: "gdkWindowToplevel".
    Jedes der Fenster enthält den "visible text": "GNU Image Manipulation Program".

    Ich hab schon ewig herumexperimentiert, aber ich weiß nicht wie das geht.

    Kann mir jemand helfen?


    Hallo,
    inzwischen habe ich mit viel Mühe das hier hinbekommen:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.2.12.1
    Author:

    Script Function: "GIMP" starten und Fensterposition geöffneter Dateien festlegen

    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    ; Aufruf des erweiterten Modus für Fenstertitel
    ;(gültig fürs gesamte Skript?)???????
    AutoItSetOption("WinTitleMatchMode", 4)

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

    ; AutoIt-TaskleistenIcon ausblenden
    #NoTrayIcon

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

    ; GIMP starten
    Run("gimp-2.6.exe")

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

    ; Skript anhalten, bis das Fenster ("", "") existiert
    WinWait("Werkzeugkasten")

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

    While 1

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

    ; der Variablen ($var) den Wert
    ; WinList("... - GIMP", "GNU Image Manipulation Program") zuweisen
    $var = WinList("[REGEXPTITLE:[^Info zu].+[ \- ]GIMP]", "GNU Image Manipulation Program")

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

    For $i = 1 to $var[0][0]
    ; Only display visble windows that have a title
    If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then ;????????

    ; Das Fenster ("", "") verschieben und dessen Größe festlegen
    WinMove("[REGEXPTITLE:[^Info zu].+[ \- ]GIMP]", "GNU Image Manipulation Program", 169, 0, 893, 771)
    EndIf
    Next ;????????

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

    ; Wenn das Fenster ("", "") nicht existiert, dann den Prozess ("AutoIt3.exe") beenden
    If Not WinExists("Werkzeugkasten") Then
    ProcessClose("AutoIt3.exe")
    EndIf

    ; Skript-Ausführung für 500 ms anhalten
    Sleep(500)

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

    WEnd

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

    Func IsVisible($handle) ;????????
    If BitAnd( WinGetState($handle), 2 ) Then ;????????
    Return 1 ;????????
    Else ;????????
    Return 0 ;????????
    EndIf

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

    EndFunc

    [/autoit]

    Soweit erfüllt das schon mal seinen Zweck.
    Nur läßt sich leider die Größe der Fenster wie oben unter 2. beschrieben, nicht verändern.
    Das mag an der "While-Schleife" liegen?

    Außerdem wird jedes Fenster nach dem Öffnen zuerst in die Taskleiste minimiert, was so nicht sein soll.

    Mein Betriebssystem: Windows XP Home Edition

    Für Hilfe bin ich dankbar.

    MfG Osterhase :)

    5 Mal editiert, zuletzt von Osterhase (7. März 2009 um 01:07)

  • Hallo,
    wie kann ich erreichen, daß "WinMove" (Zeile 38 im AutoIt-Code s.o.) auf jedes Fenster
    nur einmal angewendet wird?
    Danach soll das Fenster in Position und Größe wieder manipulierbar sein.


    Vielen Dank schon mal.

    Osterhase :)

  • Hallo nochmal,
    kann man da vielleicht was mit dem "handle" vom jeweiligen Fenster machen?
    Das "handle" vielleicht speichern und dann, wenn ein neues Fenster geöffnet wird, vergleichen,
    ob es schon mal mit dem "WinMove"-Befehl verändert wurde?
    Und wenn ja, wie?

    Bitte um Hilfe

    Osterhase :)

  • Ich habe das schon mal so gelöst, mein Suchbefehl ist natürlich nicht so schick wie Deiner :whistling:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("WinTitleMatchMode", 2) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase
    Global $counter = 1

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

    $list = WinList() ; alle Prozesse
    If IsArray($list) Then
    For $i = 1 to $list[0][0]
    If $list[$i][0] <> "" AND IsVisible($list[$i][1]) Then ; nur die sichtbaren Prozesse (sichtbar heisst mit Fenster, also nicht zwingend aktiv)
    if StringInStr ($list[$i][0], "GNU") > 0 Then
    $multihandle[$counter] = WinGetHandle($list[$i][0])
    $counter += 1
    EndIf
    EndIf
    Next
    EndIf

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

    und für die Abfrage "Bewegt oder Nicht" würde ich einen Merker nehmen (AlreadyMoved[X])

  • Hallo latemail,
    erstmal schönen Dank für Deine Hilfe. :)

    Ich habe versucht, den Code in mein Skript einzubauen.
    Nur leider funktioniert das nicht. Ich erhalte immer die Fehlermeldung:

    ==> Expected a "=" operator in assignment statement.:
    $multihandle($counter) = WinGetHandle($list[$i][0])
    $multihandle^ ERROR

    Auch verstehe ich nicht so ganz, was dein Skript macht. Kann es sein, das es mir "nur " das handle liefert?

    Ich weiß auch nicht, wie ich den "WinMove"-Befehl einbauen soll und wie das mit dem "AlreadyMoved[X]" funktioniert.

    Nebenbei: Wie kopiert man den AutoIt-Code überhaupt hier (aus dem thread) heraus?
    (Ich habe dein Skript von Hand abgetippt.)

    Jedes Fenster von GIMP soll beim Öffnen einmal bewegt werden, und dann nicht mehr.

    Gruß :)


  • Nebenbei: Wie kopiert man den AutoIt-Code überhaupt hier (aus dem thread) heraus?
    (Ich habe dein Skript von Hand abgetippt.)

    Gruß :)

    Hallo Osterhase.

    Bei Spoiler auf "Anzeigen" klicken-->

    Mit Maus in die erste zeile des codes fahren --> Linke Maustaste klicken und gedrückt halten ---> An das Ende des scriptes fahren --> Strg + C drücken --->

    Strg + V drücken um den code in deinem script einzufügen.

    Hoffe du hast ne maus ansonsten musst nochmal nachfragen *g*

    greetz MS

  • und noch ein Tip aus der Hilfe:

    WinMove ( "title", "text", x, y [, width [, height[, speed]]] )

    Parameter
    title Der Titel des zu verändernden Fensters. Hier: Mehr Infos zur Titelangabe.
    text Der Text des zu verändernden Fensters.

    Window Handles / HWNDs (ganz unten auf der Seite, leider noch nicht übersetzt)
    The variant datatype in AutoIt natively supports window handles (HWNDs). A window handle is a special value that windows assigns to a window each time it is created. When you have a handle you may use it in place of the title parameter in any of the function calls that use the title/text convention. The advantage of using window handles is that if you have multiple copies of an application open - which have the same title/text - you can uniquely identify them when using handles. When you use a window handle for the title parameter then the text parameter is completely ignored.

    also .........

    WinMove ( Fenster[1], "", x, y [, width [, height[, speed]]] )

  • @ MaxSony,
    danke für den Tip!
    Auch darauf muß man erst mal kommen... :)

    @ latemail,
    vielen Dank für deine Mühe.
    Ich werde das mal ausprobieren.

    Daß man mit dem handle jedes Fenster eindeutig identifizieren kann, war mir schon klar,
    aber die skriptmäßige Umsetzung ist eben das Problem für mich - leider.

    Ich würde anhand fertiger (auskommentierter) Skripte leichter lernen.
    Aber wo gibt's das?

    MfG :)


  • @ latemail,
    Ich würde anhand fertiger (auskommentierter) Skripte leichter lernen. IS KLAR :!::!:

    Aber wo gibt's das? HIER !!

    MfG :)


    ... das Forum mit dem totalen Service 8)


    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    AutoItSetOption("WinTitleMatchMode", 2) ; sucht nach Teilstring

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

    Global $var, $fenster[20], $moved[20]
    Global $breite = 300 ; Breite Zielfenster
    Global $hoehe = 200 ; Höhe Zielfenster
    Global $count = 0 ; Zähler für GIMP-Fenster
    Global $suchstring = "GIMP"

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

    $var = WinList() ; allen Prozessen einlesen

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

    For $i = 1 to $var[0][0] ; Gesamtanzahl der Prozesse ist in $var[0][0] gespeichert
    If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then ; nur solche Proz. mit Fenster auswählen
    If StringInStr ($var[$i][0], $suchstring, 0) > 0 Then ; nur solche Proz. mit "GIMP" im Titel auswählen, beachtet KEINE Groß/Kleinschreibung
    $count += 1 ; Zähler für Gimp-Fenster
    $fenster[$count] = $var[$i][1] ; Handle speichern
    WinMove($fenster[$count], "", 0, 0, $breite, $hoehe) ; Fenster bewegen
    $moved[$count] = 1 ; Merker für Bewegung setzen
    EndIf
    EndIf
    Next

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

    Func IsVisible($handle)
    If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
    Else
    Return 0
    EndIf

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

    EndFunc

    [/autoit]
  • Hallo latemail,

    vielen, vielen Dank! :)

    Der entscheidende Tip war: When you have a handle you may use
    it in place of the title parameter
    in any of the function calls that use the title/text convention.

    Das muß man natürlich erst mal wissen. Und dann fehlt
    ein für Anfänger aussagekräftiges Beispiel an derselben Stelle
    in der AutoIt-Hilfe woraus hervorgeht, daß, wenn der Fenstertitel
    durch eine Variable dargestellt wird, diese
    nicht in Anführungszeichen zu setzen ist.

    Mit deiner Skriptidee werde ich mich auf jeden Fall noch beschäftigen.

    Fürs erste habe ich hier (Post#8 im thread): Cumulative Window lists (no duplicates)

    ein Skript gefunden, daß ich nur leicht anpassen mußte,
    wobei dein Tip -wie gesagt- entscheidend war:

    Spoiler anzeigen
    [autoit]

    AutoItSetOption("WinTitleMatchMode", 4)

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

    ; AutoIt-TaskleistenIcon ausblenden
    #NoTrayIcon

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

    #include <Array.au3>

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

    ; GIMP starten
    Run("gimp-2.6.exe")

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

    ; Skript anhalten, bis das Fenster ("", "") existiert
    WinWait("Werkzeugkasten")

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

    ; Initialize tracking arrays
    Global $avWinListPrevious[1][2] = [[0, ""]], $avWinListCurrent

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

    ; Monitor unique window handles
    While 1
    $avWinListCurrent = WinList("[REGEXPTITLE:[^Info zu].+[ \- ]GIMP]", "GNU Image Manipulation Program")
    For $n = $avWinListCurrent[0][0] To 1 Step -1
    ; Check has title and visible
    If ($avWinListCurrent[$n][0] <> "") And BitAND(WinGetState($avWinListCurrent[$n][1]), 2) Then
    ; Check for already seen
    $fFound = False
    For $i = 1 To $avWinListPrevious[0][0]
    If $avWinListCurrent[$n][1] = $avWinListPrevious[$i][1] Then
    $fFound = True
    ExitLoop
    EndIf
    Next

    ; New window found
    If Not $fFound Then
    WinActivate($avWinListCurrent[$n][1], "")
    WinMove("[REGEXPTITLE:[^Info zu].+[ \- ]GIMP]", "GNU Image Manipulation Program", 169, 0, 893, 771 )
    EndIf
    Else
    _ArrayDelete($avWinListCurrent, $n)
    EndIf
    Next
    $avWinListCurrent[0][0] = UBound($avWinListCurrent) - 1
    $avWinListPrevious = $avWinListCurrent

    Sleep(150)

    If Not WinExists("Werkzeugkasten") Then
    ProcessClose("AutoIt3.exe")
    EndIf
    WEnd

    [/autoit]

    So verändert, macht es exakt das was ich wollte!

    Gruß Osterhase

    PS: Gerade sehe ich, daß du mir ein fertiges Skript gepostet hast.
    Nochmals Danke! Ich werde es ausprobieren. :thumbup:

    2 Mal editiert, zuletzt von Osterhase (7. März 2009 um 01:09)