Nur tatsächlich sichtbare Fenster auf dem Desktop auflisten

  • Hallo,

    leider scheitere ich wieder einmal an einer sicherlich ganz einfachen Hürde.
    Ich möchte gerne alle auf dem Desktop sichtbaren Fenster - aktive und inaktive - in einem Array zur weiteren Verwendung auflisten.
    Ich habe es mit WinList() versucht, bin aber leider gescheitert, da diese Funktion neben den sichtbaren offenen Fenster auf dem Desktop auch noch weitere unsichtbare Fenster (woher auch immer die kommen) auflistet.

    Bei mir zu Beispiel:
    -- "AMD:CCC-AEMCapturingWindow"
    -- "Host für die Windows Shell-Oberfläche"
    -- "Rechner" (gleich 2x und für mich völlig unverständlich, da Calc.exe nicht von mir gestartet wurde).

    sowie

    -- "Einstellungen" (ebenfalls 2x und nicht von mir gestartet)


    Nun wäre es möglich mit: "BitAnd()" und "WinGetState()" sowie mit: "If Not $array[$i][0] = "[Fenstername]" Then ..." (in einer For ... Next Schleife) zu filtern, dies würde aber die Allgemeingültigkeit, da nicht immer die gleichen "unsichtbaren Fenster" existieren, in Frage stellen und unter Umständen zu falschen Ergnissen führen.
    Wie also könnte ich's machen, dass tatsächlich nur die wirklich sichtbaren Fenster auf dem Desktop im Array gespeichert werden?

    Bin für jede Idee dankbar

    MfG., AutoItler

    Lege dich nie schlafen ohne zu wissen,
    dass du an diesem Tag etwas Gutes getan hast.

  • Hallo @AutoItler,

    Ich könnte schreiben, schau dir mal das Beispiel zu WinList an. Aber dann hätten wir wahrscheinlich wieder Ärger. :P

    Daher hier ein ausführbares Beispiel:

    Spoiler anzeigen

    EDIT: Und doch wieder ein Beitrag, um Krieg mit dir zu führen. Bei Nachdem ich den Firefox geöffnet habe, sehe ich auch zwei Download-Fenster, obwohl ich das gar nicht geöffnet habe. ^^

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (16. Juli 2017 um 19:07)

  • -- "Einstellungen" (ebenfalls 2x und nicht von mir gestartet)

    WinList() gibt dir nur die Fensternamen. Es wäre vermessen aus diesen Namen auf den tatsächlichen Namen der .exe etc. zu schließen. Rechner muss also nicht calc.exe bedeuten. Der Taskmanager sagt dir mehr dazu (ggf. zusätzliche Spalten einblenden)
    ProcessList würde hingegen die Prozesse (also auch calc.exe) auflisten
    Ansonsten hat @autoiter die die Lösung präsentiert

  • Dank an alle.

    Hallo Autoiter, wie auch bei meinem letzten Problem ... na gut, lassen wir das. Hast Du Dein vorgeschlagenes Script mal selber ausgeführt? Wenn ja, dann wäre Dir sicher aufgefallen, dass auch Fenster aufgelistet weden, die nicht auf dem Desktop sichtbar sind, auch nicht in der Taskleiste angezeigt werden. Soweit wie Du bin ich nämlich auch. Ich möchte aber nur die tatsächlich sichtbaren Fenster in einem Array erfassen. Und genau das gelingt mir nicht. Vielleicht findet sich ja jetzt nach meiner Präzisierung doch noch eine Lösung. Würde mich freuen.

    Hallo Blinz,
    über WinList() erhalte ich zu jedem Array-Eintrag (1. Dimension), auch zu denen, die einen Fensternamen enthalten, ein Handle (2. Dimension),dem eindeutig ein Prozess zugeordnet ist. Also kann ich schon aus dem Fensternamen - dem Taskmanager sei Dank - auf die dazugehörige "xyz.exe" schließen. Außerdem ist eine Manipulation mit ProcessList() in meinem geplanten Script nicht vorgesehen. Dein Beitrag betrifft also mein Problem nicht. Aber trotzdem nochmals danke für das Interesse.

    Lege dich nie schlafen ohne zu wissen,
    dass du an diesem Tag etwas Gutes getan hast.

  • Ähm @AutoItler.
    Hast du meinen langen Beitrag gelesen? Dann wäre dir sicher aufgefallen.. ;)

    EDIT: Und doch wieder ein Beitrag, um Krieg mit dir zu führen. Bei Nachdem ich den Firefox geöffnet habe, sehe ich auch zwei Download-Fenster, obwohl ich das gar nicht geöffnet habe.

    (And the Misery goes on..)

    Grüße autoiter

  • über WinList() erhalte ich zu jedem Array-Eintrag (1. Dimension), auch zu denen, die einen Fensternamen enthalten, ein Handle (2. Dimension),dem eindeutig ein Prozess zugeordnet ist. Also kann ich schon aus dem Fensternamen - dem Taskmanager sei Dank - auf die dazugehörige "xyz.exe" schließen.

    Schließen ja. Trotzdem hat der Fenstername nichts mit dem Programmnamen zu tun. Wenn ich in einem Script eine GUI "Rechner" nennen kann der Prozess dazu trotzdem "Walter.exe" heißen.
    Kurze Suche mit google ergab das WinGetProcess() einem die PID zum Fenster liefert - dessen Wert sich wieder mit ProcessList() abgleichen ließe um den Namen der .exe zu bekommen.

    Was man dann wieder zusammenfassen kann - denn ein Programm kann ja wiederum mehrere Fenster haben die auf eine .exe münden

    Der Taskmanager zeigt einem - die richtigen Spalten eingeblendet - aber richtig an

    Zu dem Script von @autoiter:
    In der tat zeigt es bei auch Einträge für jedes Gadget (Die Mini-Anwendungen von Windows 7, habe ich unter W10 auch noch am laufen), einiges was nur ein Symbol im Info-Bereicht hat ... und einige Microsoft-Store Anwendungen

    Ich habe mal folgendes geändert

    AutoIt
    $aVisible[$iCount][1] = $aList[$i][1]
    ; in
    $aVisible[$iCount][1] = WinGetState($aList[$i][1])

    Dann sieht man den Status in der 2. Spalte. Und der zeigt mir das wir hier mit WinGetState() nicht weiter kommen. Da bräuchte es einen besseren Befehl.

    Bei läuft übrigendes auch 2x der Rechner. Wie alle MicrosoftApps scheinbar 2x laufen. Und den Rechner hatte ich wieder beendet. Wie es bei den Handys üblich ist laufen die Apps aber weiter damit diese beim nächsten Start schneller zur Verfügung stehen (Calc.exe ist ja jetzt auch eine App).

  • Hallo nochmals, da ich von den sichtbaren Fenstern für mein script eigentlich nur das augenblicklich aktive zur weiteren Verwendung brauche, habe ich nochmals mit WinList() experimentiert.
    Dabei habe ich durch reinen Zufall - ich hab's vorher zumindest nicht gewusst - festgestellt, dass in der Array-Variable das Element[1][0] immer den Fensternamen des momentan aktiven Fensters enthält. In der Erläuterung zu WinList() ist es leider eben auch nicht erwähnt.
    Ich habe meine Erkenntnis mehrfach, auch mit verschiedenen Fenstern, überprüft: Immer enthielt Element[1][0] den Fenstertitel des momentan aktiven Fensters.
    Mit anderen Worten, Problem für mich gelöst, Thema ist geschlossen.
    Vielen dank noch einmal für's Interesse.

    Lege dich nie schlafen ohne zu wissen,
    dass du an diesem Tag etwas Gutes getan hast.

  • Hallo AspirinJunkie, danke für's Interesse. Eigentlich ist das Thema geschlossen, möchte Dir aber dennoch antworten. Deine Idee funktioniert nur, solange das Script im Interpreter ausgeführt wird. In dem Moment, indem das Script compiliert und dann die Exe ausgeführt wird, ergibt

    WinGetTitel('[ACTIVE]')

    grundsätzlich den Fensternamen der Exe. Also muss ein anderer Weg gegangen werden.
    Wie schon gesagt, habe ich das Thema als erledigt markiert.

    Lege dich nie schlafen ohne zu wissen,
    dass du an diesem Tag etwas Gutes getan hast.

  • Äh nein. Folgendes kompiliert:

    AutoIt
    Sleep(3000)
    $s_Title = WinGetTitle("[active]")
    MsgBox(0,"", $s_Title)

    Ausgeführt - Irgendein Fenster hochgeholt und die Msgbox zeigt korrekt den Fensternamen dieses Fensters an.
    Wäre dem nicht so wäre es ein Bug.

  • Nur kurz zur Verifikation :
    Ich habe das Beispiel von @AspirinJunkie (kompiliert) mit div. Fenstern ausgeführt.
    Es zeigt immer einwandfrei das aktuell aktive Fenster an. Wo ist also das Problem ?

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Sein Problem ist das er sein eigentliches Problem nicht geschafft hat zu beschreiben.
    Ich kann es ehrlich gesagt nicht fassen dass hier 4 Tage lang mit WinList/ProcessList/WinGetState etc. rumgedoktort wurde ohne dass er verraten hat, dass sein eigentliches Problem banalerweise darin besteht den Fenstertitel des aktiven Fensters zu erhalten.

  • Hallo @AspirinJunkie !

    Sein Problem ist das er sein eigentliches Problem nicht geschafft hat zu beschreiben.

    Genau betrachtet, hat er sogar zwei komplett unterschiedliche Szenarien beschrieben ^^ !

    Beitrag 1 :

    Ich möchte gerne alle auf dem Desktop sichtbaren Fenster - aktive und inaktive - in einem Array zur weiteren Verwendung auflisten.

    Beitrag 7 :

    Hallo nochmals, da ich von den sichtbaren Fenstern für mein script eigentlich nur das augenblicklich aktive zur weiteren Verwendung brauche


    Das macht jede Form der Hilfestellung im Grunde obsolet.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."