Wechsel zwischen geöffneten Fenstern - Raupi's Script

  • Hallo Freunde der automatisierten Schritte,

    Raupi hat in Post 17

    Wechsel zwischen geöffneten Fenstern

    ein recht interessantes Script als Alt Tab Ersatz gepostet.

    Wer mag das Script mit updaten?

    1. Das Grundfenster soll 2x so hoch und 3x so breit werden.
    In welchen Zeilen muss dass geändert werden?

    2. Die Button sollen 3x so breit werden.
    In welchen Zeilen muss dass geändert werden?

    3. Die Programme sollen von A-Z sortiert werden, bevor sie als Button angezeigt werden.

    Ich habe das mit
    _ArraySort($relatedwindows, 0)
    probiert. Anzeige und Sortierung dauern ewig ... weil ...

    ... auf meinem System im Array rund 1300 Zeilen und 249 Spalten verwendet werden, obwohl nur 21 sichtbare Fenster vorhanden sind.
    Die anderen Zeilen und Spalten erscheinen leer.

    Und warum 249 Spalten mit Array Display angezeigt werden, erschließt sich mir nicht - weiß jemand, warum?
    Und ob diese eine Funktion im Script haben?

    Das Array wurde damals als

    $allwindows = WinList()
    $count = $allwindows[0][0]
    Global $relatedwindows[$count][$count]
    definiert.

    Wie kann man das optimieren, dass das Array nur die Größe der sichtbaren Fenster hat? Dann müsste auch die Sortierung schneller funktionieren.

    Wer das Script testet, wird sehen, dass im Aktions-Fenster nur 8 leere Button + Cancel zu sehen ist.
    Dass auf den 8 Button des Aktionsfensters nichts zu sehen ist, liegt daran, dass die Icons im ursprünglichen Thread nicht beigefügt wurden - oder täusche ich mich?

    4. Es wird hier von meinen Programmen auf den Button nur vom einem Programmfenster (PotPlayer) kein Icon angezeigt. Das ist zwar auf der Startleiste vom Windows 8 / 64 zu sehen, aber nicht auf dem Button im obigen Script. Weiß jemand, wie man das am besten beheben kann?

    5. Ich würde das Programm gerne um einen Button "Liste aktualisieren" ergänzen.

    Falls Ihr noch weitere empfehlenswerte Alt Tab Listen kennt, die mit Autoit erstellt wurden, würde ich mich über einen Link freuen.

    Nach 4 Stunden Tests - Schlafenszeit - 4:50 Uhr ;) ... 2 freie Tage und es geht zurück ins Arbeitsleben.

    Viele Grüße und vielen Dank :)
    AutoMit

    PS: Übrigens - noch eine Frage am Rande zur Fensteraktivierung:

    laut Hilfe:
    Fenster-Titel und -Text (erweitert)
    Fenster-Handles funktionieren immer, egal welcher WinTitleMatchMode gerade in Benutzung ist.

    Wie muss WinActivate(handle) geschrieben werden?
    So funktioniert es nicht, Rückgabewert 0.
    $ergebnis = WinActivate(0x00510C34) ; Handle per Script ausgelesen
    $ergebnis = WinActivate(0x0000000000510C34) ; Handle mit dem Autoit v3 Info Tool ausgelesen
    Falls man WinActivate nicht mit dem Handle als Parameter nutzen kann, wie kann man dann ein Fenster aktivieren, von dem man "nur" das Handle hat?

    7 Mal editiert, zuletzt von AutoMit (10. Februar 2016 um 05:04)

  • Hi AutoMit,
    willst du nicht lieber erstmal deinen Thread mit der G13 beenden, bevor du dich auf das nächste stürzt?

    Aber na gut:
    1. Das hat der Threadersteller des damaligen Threads im Code sehr gut kommentiert, wo man das ändern kann, wenn du das Script auch mal gelesen hättest, hättest du es direkt gefunden. Ein Augenmerk sei auf Zeile 81 gelegt.
    2. Wenn die Buttons (welche auch immer) breiter werden sollen, dann musst du logischerweise nur die Funktion GUICtrlCreateButton gemäß der Parameter (die du der Hilfe entnehmen kannst) anpassen. Auch hier ist wieder ersichtlich welche Buttons wofür sind.
    3. Dass die Anzahl der Spalten in deinem Array ungleich der Anzahl der Zeilen sind, das wage ich mal stark zu bezweifeln. Wie kommst du auf die Werte?
    In Zeile 60. durchläuft das Script alle Fenster und pickt die raus, die (der damalige Autor) sehen will. Danach stehen in dem Array relatedWindows nur solche drin, die er auch später anzeigen lassen will.
    Du könntest das Array jetzt durchlaufen, bis zum ersten Eintrag, an dem nix drinnen steht und ein neues Array der Größe erschaffen, um darin die zu wechselnden Fenster anzuzeigen.
    Das mit den Buttons hast du gut erkannt.
    4. Da ist Eigeninitiative gefragt, informiere dich dazu, wie man die Icons aus Fenstern / Ausführbaren Programmen bekommt.
    Zwischen Zeile 115 und 120 steht der Code, der dafür interessant ist.
    5. Schön, dass du das willst, und was meinst du damit?

    €: Was willst du mit dem WinActivate anstellen? Wie hast du es denn geschrieben? Hoffentlich nicht im Code "WinActivate(handle)" (man weiß ja nie)?
    Um das Fenster zu aktivieren brauchst du das Handle des Fensters, das bekommst du über verschiedene Wege, AutoIt Hilfe und Google seien dein Freund und Helfer.

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

  • Um das Array zu verkleinern must du ein ReDim ausführen:

    Code
    $relatedwindows[0][0] =$j-1		;in 0|0 Anzahl der Zeilen
    ReDim $relatedwindows[$j][3]
    _ArraySort($relatedwindows,0,1)		;ab 1. Zeile mit der Sortierung beginnen
    _ArrayDisplay($relatedwindows)


    Für die Guigröße mußt du doch nur mit den gewünschten Werten multiplizieren:

    Code
    $background = GUICreate("", $guiW*2, $guiH*3, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)


    Die Buttons werden in der Schleife ab 110 (neu!) erzeugt. Die Positionen musst du neu errechnen, da sich Fenstergröße ja geändert hat und

    Einmal editiert, zuletzt von autoBert (10. Februar 2016 um 19:00)

  • @autoBert - vielen Dank für Deine Hilfe ! :)


    @Xorianator - ...


    @Xorianator schrieb: "Was willst du mit dem WinActivate anstellen? Wie hast du es denn geschrieben? Hoffentlich nicht im Code "WinActivate(handle)""


    Genau das habe ich, wie in Post 1 geschrieben: "WinActivate(0x00510C34)"


    ich schrieb: "Falls man WinActivate nicht mit dem Handle als Parameter nutzen kann, wie kann man dann ein Fenster aktivieren, von dem man "nur" das Handle hat? "


    Was ich mit WinActivate möchte: "Holt ein bestimmtes Fenster in den Vordergrund und setzt den Fokus auf dasselbe." - genau das.


    Es funktioniert nicht, wenn ich das Handle bei WinActivate einsetze.


    Da ich nur das Handle habe, fragte ich: wenn ich nur das Handle habe, wie aktiviere ich ein Fenster über das Handle in Analogie zu WinActivate?


    @Xorianator schrieb: "wenn du das Script auch mal gelesen hättest"


    Ich habe mich über 2 Stunden damit auseinandergesetzt. Wenn ich Dir einen japanischen Text vorlege (Sprache darfst Du frei wählen), dann kannst Du den mit geringen Kenntnissen verstehen?
    Natürlich nicht. Und daher frage ich im Forum "Hilfe und Unterstützung" nach jemand, der den Text versteht.

    Ist es untersagt, einen Text verstehen zu wollen, den man bisher nicht versteht? Natürlich nicht.

    Der Erfolg hängt von der Hilfe derjenigen ab, die helfen können. Solange die sagen, "das ist zu schwer für Dich", "lies die Hilfe", "fange klein an" - wird es nichts mit dem "Verstehen" = "Automatisieren".

    Autoit ist für mich dazu da, um Schritte zu automatisieren.

    Ich muss und kann vor allem nicht jeden einzelnen Schritt verstehen. Dazu reicht meine Lebenszeit nicht mehr aus.

    Daher sind Funktionen in UDFs verpackt und andere Funktionen hart codiert in Autoit. Oftmals gibt es Scripte, die bei dem einen oder anderen fertig in der Schublade liegen - wie z.B. UDFs und kleinere selbstgestrickte oder in (anderen) Foren gefundene Scripte.

    Warum soll man nicht hier fragen, ob jemand das Rad schon erfunden hat und so freundlich wäre, sein (gefundendes oder geschriebenes) Script zu teilen oder mit seinen Kenntnissen das Script weiterzuentwickeln?

    Also frage ich, und wenn jemand helfen kann - und vor allem Interesse hat zu helfen, super. Ich freue mich.

    Und wenn der Thread nicht auf Gegenliebe stößt - hey - Pech - dann kann ich das Thema erst in einigen Monaten oder eventuell erst in eingen Jahren bearbeiten, wenn ich "Japanisch" so gut kann, wie es für die erbetene Automatisierung erforderlich ist. Und niemand muss sich Sorgen um meinen eröffneten Thread machen, weil der dann ohne Antworten in der Versenkung verschwindet. Oft werden Threads ohne hilfreiche Kommentare hochgeholt von Usern, die sich darüber beklagen, man hätte doch die Hilfe lesen können. Man hätte sich doch das Script ansehen können. Man hätte doch ...

    Beiträge ohne Antworten verschwinden einfach in der Versenkung - das ist der "Tip des Tages" für all jene, die meinen, der Fragesteller hätte das Thema nicht eröffnen sollen.

    Und mein herlicher Dank gilt all jenen, die wirklich helfen. Und auch das fand ich hier häufig.

    Liest man frühere Beiträge von Raupi & Co fallen einem viele abgeänderte oder verbesserte lauffähige Scripte auf. Bei meinen Fragen habe ich seltener das Glück. Ich lerne jeden Tag was in Autoit dazu. Und ich möchte auf Grundsatzdiskussionen verzichten.

    Mein Ziel ist immer: Automatisierung. Im Moment stolpere ich über viele Hürden.

    @Xorianator schrieb: "3. Dass die Anzahl der Spalten in deinem Array ungleich der Anzahl der Zeilen sind, das wage ich mal stark zu bezweifeln. Wie kommst du auf die Werte?"


    Ich habe das Array mit _ArrayDisplay angezeigt und dort waren die Werte zu sehen. Leider - denn die meisten Zeilen und Zellen waren leer.


    @Xorianator schrieb: "In Zeile 60. durchläuft das Script alle Fenster und pickt die raus, die (der damalige Autor) sehen will. Danach stehen in dem Array relatedWindows nur solche drin, die er auch später anzeigen lassen will."


    Eben nicht - es ist laut _ArrayDisplay ein riesiges Array mit viel Luft (leer) und 21 gefüllten Zeilen. Daher waren die Button, nach einer alphabetischen Sortierung des Arrays auch leer. Oben standen die leeren Zeilen, also Button nicht gefüllt.


    @Xorianator schrieb: "5. Schön, dass du das willst, und was meinst du damit?"
    ich schriebn "5. Ich würde das Programm gerne um einen Button "Liste aktualisieren" ergänzen."


    Das Programm liest die aktuell offenen Fenster ein. Wenn - solange das Programm aktiv ist - Fenster aus dieser Liste in der Zwischenzeit geschlossen wurden, bekommt das Programm das nicht mit.
    Da eine automatische Aktualisierung wohl noch komplizierter ist, dachte ich an eine manuelle Aktualisierung per Mausklick "Liste aktualisieren".

    Falls ich eine Deiner Fragen übersehen haben sollte, einfach kurzes Stichwort - ich ergänze dann eine Antwort.

    5 Mal editiert, zuletzt von AutoMit (12. Februar 2016 um 14:33)

  • @autoBert - vielen Dank für Deine Hilfe ! :)

    war für dieses Skript, das letzte mal. Ich halte es für nicht zu Ende gebracht und stürzt bei mir ohne Fehlermeldung nach Tastendruck (fehlende Icons) ab. Egal ob Absturz oder mit Cancel beendet, es bringt mir alle sichtbaren Fenster in der Anordnung und Größe durcheinander.


    Genau das habe ich, wie in Post 1 geschrieben: "WinActivate(0x00510C34)"

    ich schrieb: "Falls man WinActivate nicht mit dem Handle als Parameter nutzen kann, wie kann man dann ein Fenster aktivieren, von dem man "nur" das Handle hat? "

    Was ich mit WinActivate möchte: "Holt ein bestimmtes Fenster in den Vordergrund und setzt den Fokus auf dasselbe." - genau das.

    Es funktioniert nicht, wenn ich das Handle bei WinActivate einsetze.

    Da ich nur das Handle habe, fragte ich: wenn ich nur das Handle habe, wie aktiviere ich ein Fenster über das Handle in Analogie zu WinActivate?

    WinActivate akzeptiert FensterHandles anstelle des Titles. zumindest ist mir nichts gegenteiliges bekannt.


    ist wirklich nicht so: 3 Spalten werden gebraucht aber genauso viele Spalten wie Zeilen erzeugt, daß zu meinem obigen "Ich halte es für nicht zu Ende gebracht" und um Raupi in Schutz zu nehmen, er hat nur etwas mit dem EXE-Icon implementiert. Die Lösung hierzu habe ich ja schon mit Wechsel zwischen geöffneten Fenstern - Raupi's Script gepostet. Danach ist die Anzahl der Spalten immer 3 und die Anzahl der Zeilen hängt von den geöffneten Fenstern ab.

    4 Mal editiert, zuletzt von autoBert (12. Februar 2016 um 15:26) aus folgendem Grund: Probleme mit bb-code und Optik

  • Ich halte es für nicht zu Ende gebracht und stürzt bei mir ohne Fehlermeldung nach Tastendruck (fehlende Icons) ab. Egal ob Absturz oder mit Cancel beendet, es bringt mir alle sichtbaren Fenster in der Anordnung und Größe durcheinander.

    Bei mir gibt es mit dem Script auch einige _Probleme - u.a. diese, da man ja "Leichen" nicht ausgraben, sondern einen neuen Thread eröffnen soll, hoffte ich, dass fachkundige Mitstreiter das Script zum Leben erwecken und bei der Gelegenheit die obg. Modifikationen mit einarbeiten.
    Aber im Moment scheint es eine ungünstige Zeit zu sein, dafür Leute zu finden.

    WinActivate akzeptiert FensterHandles anstelle des Titles. zumindest ist mir nichts gegenteiliges bekannt.


    Kann WinActivate ein Fensterhandle verarbeiten?

    Mir gelingt es leider nicht - anbei das Script - wo ist der Fehler bei der Fensteraktivierung über das Fensterhandle (mit Autoit Window Info ausgelesen)?

    AutoIt
    Opt("winTitleMatchMode",2)
    $Fenster_aktuell = "[CLASS:Notepad; TITLE:Editor]"
    WinActivate($Fenster_aktuell)
    
    
    Sleep (2000)																	; 	kurze Pause, um von Hand das Fenster zu wechseln
    
    
    $Fenster_aktuell = "0x00000000001925F4"			;	Handle ausgelesen mit Autoit 
    WinActivate($Fenster_aktuell)
    • Offizieller Beitrag

    Kein Wunder, wenn Dir das nicht gelingt!
    Das Handle wechselt bei jedem Aufruf. Du kannst das nicht einmalig auslesen und dann ins Script schreiben.
    Du musst das Handle zur Laufzeit ermitteln:

  • Das Handle wechselt bei jedem Aufruf.


    Oscar, so kurz bin ich nun wirklich nicht dabei :) Und doch übersehe ich was.

    Bitte führe mal mein Script aus und aktualisere natürlich im Aufruf das Fensterhandle in Zeile ""$Fenster_aktuell = "0x000654E6" nach dem ersten Durchlauf mit dem Wert aus der Console. Notepad bleibt offen und erneuter Scriptdurchlauf.

    Console:

    1. -> 0x000654E6
    2. -> 0
    3. -> 0x000654E6

    Schau dann mal in die Console und sage mir bitte, warum in der Console Zeile 2 = 0 ist.

    Das Handle aus Zeile 6 des Scripts stimmt ja überein mit Console-Zeile 1 und 3.
    Also ist es das aktuelle Fensterhandle für Notepad.

    4 Mal editiert, zuletzt von AutoMit (12. Februar 2016 um 19:47)

  • Und jetzt beende Notepad mal und starte es neu.


    Ach Oscar, ich weiß dass sich dann das Fensterhandle ändert. Aber das ist nicht meine Frage.

    Führe doch bitte mal das Script Post 9 aus und sage mir, warum Zeile 2 bei dem Durchlauf 0 ergibt.

    @all - natürlich richtet sich meine Frage an alle. Wäre super, wenn sie mir jemand beantwortet.

    • Offizieller Beitrag

    Ganz einfach "0x000654E6" <> 0x000654E6 .
    Das eine ist ein String das andere eine Hexzahl ;)

    Edit: Das Winhandle ist ein Pointer und kann nicht durch einen String ersetzt werden.

  • Ganz einfach "0x000654E6" <> 0x000654E6 .
    Das eine ist ein String das andere eine Hexzahl ;)

    Einen Schritt weiter - danke.

    Wie kann ich

    $Fenster_aktuell = "0x000654E6"

    schreiben, dass 0x000654E6 als Hexzahl erkannt wird?

    So geht es nicht:

    $Fenster_aktuell = 0x000654E6

    • Offizieller Beitrag

    Wenn du meinen Post gelesen hast, dann kannst du es dir selber beantworten.
    Aber um dein Gehirn nicht zu sehr zu beanspruchen, lasse mal die " " weg, dann ist es eine Zahl.

    Btw, lerne erst mal die AutoIt Grundlagen, sowas ist Fundmentalwissen.

    AutoIt
    0x00020568 ;Zahl
    "0x00020568" ; String
  • Wenn du meinen Post gelesen hast, dann kannst du es dir selber beantworten.
    Aber um dein Gehirn nicht zu sehr zu beanspruchen, lasse mal die " " weg, dann ist es eine Zahl.

    Btw, lerne erst mal die AutoIt Grundlagen, sowas ist Fundmentalwissen.

    Wenn wir uns gegenseitig beleidigen wollen, würde ich jetzt sagen:

    Schmusekatze, gehe zum Optiker. :)

    Ich schrieb in Post 13 über Deinem Betrag.

    Und um Deine Augen nicht zu sehr zu beanspruchen - ja es steht genau - 1 Zeile über Deinen freundlichen Worten: "Aber um dein Gehirn nicht zu sehr zu beanspruchen"

    So geht es nicht:

    $Fenster_aktuell = 0x000654E6

    Wie Du siehst, habe ich die Anführungszeichen weggelassen und bereits bevor ich den 1. Beitrag hierzu geschrieben habe, habe ich das getestet.

    Warum testet niemand mal mein Script?

    Warum schreibt niemand eine Antwort, die er selbst getestet hat?

    Mensch, Raupi, Du bist einer der wenigen hier im Forum, von denen ich viele fundierte und gute Beiträge gelesen habe - mit langen Scripts, genialen Ideen und Hilfen für Anfänger - und dann sowas?

    Einmal editiert, zuletzt von AutoMit (12. Februar 2016 um 20:36)

    • Offizieller Beitrag

    Was du machst ist mir schleierhaft, bei mir funzt das.
    Ich habe es sehr wohl getestet und mir wird das hier blöd.
    Hilf dir in Zukunft selbst, bin raus.

  • Raupi - wer ungerechtfertigt austeilt, muss auch einstecken können.

    Wie Du gesehen hast, habe ich das als Zahl und als String vor Deiner Beleidigung getestet.
    Es steht eine Zeile über Deinem Beitrag.
    Eine Entschuldigung wäre eher angegracht, als sich beleidigt zurückzuziehen.
    Überhaupt wäre es harmonischer, auf persönliche Anspielungen zu verzichten.
    Wir sind hier, um zu automatisieren.

    Zurück zum sachlichen Thema.

    Auch ein weiterer Versuch mit einem neuen Handle brachte gleiches Ergebnis ->0.
    (wer es testen möchte - siehe Post 9)

    ISN

    $Fenster_aktuell = 0x00244462

    0x00244462
    0
    0x00244462

    Scite

    $Fenster_aktuell = 0x0000000000244462

    0x0000000000244462
    0
    0x0000000000244462

    Einmal editiert, zuletzt von AutoMit (12. Februar 2016 um 20:57)

    • Offizieller Beitrag

    [Blockierte Grafik: http://www2.pic-upload.de/thumb/29721408/Unbenannt.png]

    Und wenn du dich auf den Kopf stellst, das funzt 1A.

    http://www.pic-upload.de/view-29721408/Unbenannt.png.html

    • Offizieller Beitrag

    Welches Programm macht solche unmöglichen Ausgaben? SciTE? Viel zu viele Nullen.