(Child-) Fenster erkennen anhand von HWND


  • Mod

    Wäre es nicht einfache runs erstmal zu sagen was Du vorhast?
    Was nützt bitte das Speichern von Fenster Handles?



  • Sorry, bin in Gedanken schon dabei und vergess deshalb das Vorhaben zu erwähnen.

    Es geht darum, dass ich Daten aus Fenstern auslesen will und später ggf. auch GUI Steuerung übernehmen möchte (anfangs mit simplen Mausklicks). Diese Fenster muss ich, wie im Thema angesprochen, anhand von einem Hauptprozess finden und würde diese dann gerne in einer Liste ablegen, damit ich diese jederzeit vom Programm durchsuchen kann (statt Fenster wieder neu suchen zu müssen).

    D.h.:
    1. Hauptprozess finden
    2. Fenster die relevant sind ausfindig machen und in Variable speichern
    3. Bei Bedarf auf Fenster in Variable zurückgreifen
    4. Sobald ein Fenster geschlossen wird, dieses aus der Variable mit Liste entfernen.

    Grüße,
    Martin


  • Mod

    Da Fenster, und vor allem Unterfenster sich so schnell ändern können, macht das Speichern in einer Liste wohl kaum Sinn.

    Wie willst Du denn bitte auf Deine Feldliste zugreifen?
    Wie willst Du denn ein Fenster identifizieren, wenn nicht in seinem Kontext, also dem Hierarchiebaum?

    Wenn benötigst Du eine "Sprache" die Dir hilft ein Control zu finden und es anzusteuern.
    Ich frage mich nur warum Du das machst, weil es X-Makro/skript Tools bereits gibt: AutoHotKey, AutoIt etc...
    Und wohl gemerkt, die sind extrem leistungsfähig.



  • Martin Richter schrieb:

    Da Fenster, und vor allem Unterfenster sich so schnell ändern können, macht das Speichern in einer Liste wohl kaum Sinn.

    Wie willst Du denn bitte auf Deine Feldliste zugreifen?
    Wie willst Du denn ein Fenster identifizieren, wenn nicht in seinem Kontext, also dem Hierarchiebaum?

    Wenn benötigst Du eine "Sprache" die Dir hilft ein Control zu finden und es anzusteuern.
    Ich frage mich nur warum Du das machst, weil es X-Makro/skript Tools bereits gibt: AutoHotKey, AutoIt etc...
    Und wohl gemerkt, die sind extrem leistungsfähig.

    Hallo Martin,

    das "Unterfenster" ist eigentlich ein reguläres Windows Fenster und bleibt die Anwendung über offen und ändert den Titel nicht. Es ist jedoch hierachisch nicht dem eigentlichen Fenster zugeordnet, weshalb ja dieser Thread entstanden ist.

    Um auf die Fragen einzugehen:
    - Zugriff über eine Liste mit einem Iterator, damit ich die Fenster nach und nach ansteuern kann und prüfe, ob es sich um ein gesuchtes Fenster handelt (in dem Fall wäre ein Childwindow anders und eindeutig identifzierbar)
    - AutoHotKey usw kenne ich, jedoch ist das erst die Basis des Programms. Später würde ich gerne DLLs in den Prozess einschleusen und etwas mehr machen, Grundlage sind aber immernoch die jetzt gefundenen Fenster.

    Grüße,
    Martin


  • Mod

    milchbart schrieb:

    das "Unterfenster" ist eigentlich ein reguläres Windows Fenster und bleibt die Anwendung über offen und ändert den Titel nicht. Es ist jedoch hierachisch nicht dem eigentlichen Fenster zugeordnet, weshalb ja dieser Thread entstanden ist.

    Und das definierst Du?
    Wenn Du es gefunden hast kannst Du Dir das Handle merken, das sollte genügen. Warum willst Du die ganze Struktur ablegen?
    Zudem kannst Du dann von diesem Fenster ja wieder aus suchen.



  • Genau, das Handle wollte ich in einer Liste speichern, also lediglich die ID.
    Das ist dann ein Vektor des Typs HWND? Oder kann das Handle noch weiter runtergebrochen werden.

    Wichtig ist nur, dass die Liste mit einem Iterator durchsucht werden kann um die Fenster anschlißend wieder zu laden bzw. gewöhnliche Funktionen darauf zu beziehen.

    Grüße,
    Martin


  • Mod

    Das Handle eines Fensters ist keine ID, es its ein Handle, also ein Griff um Dinge mit dem Ding zu machen.

    Ja man kann es in einem Vektor speichern und man kann es vergleichen.
    Ein Handle ist (übertragen) nichts anderes als ein (void*)...

    Warum brauchst Du einen vector, wenn Du nur mit einem Fanster was tun möchtest?



  • Martin Richter schrieb:

    Das Handle eines Fensters ist keine ID, es its ein Handle, also ein Griff um Dinge mit dem Ding zu machen.

    Ja man kann es in einem Vektor speichern und man kann es vergleichen.
    Ein Handle ist (übertragen) nichts anderes als ein (void*)...

    Warum brauchst Du einen vector, wenn Du nur mit einem Fanster was tun möchtest?

    Einfach ausgedrückt möchte ich mit allen Fenstern die zu einer ProzessID gehören Dinge wie Auslesen der Texte, Simulieren von Keyboard/Mouse Events, ... machen.

    Wenn das nicht empfehlenswert ist, wie würdest du da vorgehen? Mir fallen spontan nur folgende Alternativen ein:
    1. Gesamten Prozess nach Zeit x erneut durchlaufen, d.h. Prozess-ID anhand von "Master Fenster" suchen, weitere Fenster mit der Prozess ID finden und arbeiten
    2. Nur "Master Fenster" merken und Child Windows dynamisch ermitteln.

    Ich dachte nur, da die Fenster, einmal gefunden, sich nicht ändern (höchstens neue dazu kommen), kann ich den Handle in einer Liste ablegen die global für alle Programmteile zur Verfügung steht. So kann in einem Thread die "Such-Routine" laufen und sicherstellen, dass alle passenden Fenster in der Liste enthalten sind, und der eigentliche Thread mit dieser globalen Liste arbeiten und die Aktionen durchführen.


  • Mod

    milchbart schrieb:

    Einfach ausgedrückt möchte ich mit allen Fenstern die zu einer ProzessID gehören Dinge wie Auslesen der Texte, Simulieren von Keyboard/Mouse Events, ... machen.

    Dann sollte Dir klar sein, dass man dazu gar kein Handle benötigt!
    Tastatur und Mauseingaben können nur systemweit durch SendInput simuliert werden.

    Mir wird das Ganze zu abstrus...



  • Martin Richter schrieb:

    milchbart schrieb:

    Einfach ausgedrückt möchte ich mit allen Fenstern die zu einer ProzessID gehören Dinge wie Auslesen der Texte, Simulieren von Keyboard/Mouse Events, ... machen.

    Dann sollte Dir klar sein, dass man dazu gar kein Handle benötigt!
    Tastatur und Mauseingaben können nur systemweit durch SendInput simuliert werden.

    Mir wird das Ganze zu abstrus...

    Zu abstrus? Vielleicht bin ich einfach nicht in der Lage, das ganze einfach darzustellen.

    Das Handle benötige ich, um Daten zu sammeln, nicht um systemweit Input zu simulieren. Was ich jedoch bevorzuge, wenn ich das nötige Wissen habe, Buttons, die im Fenster erscheinen, nicht via Mauseklick zu drücken, sondern direkt über den Button und/oder der injezierten DLL. Da benötige ich das Handle, oder?


Anmelden zum Antworten