Jump to content

findWindow(), verschwundene Handles

Empfohlene Beiträge

Hallo Community,

ich entwickle im Moment eine Software mit der ich ähnlich wie mit Testtools wie WinRunner eine andere Software fernsteuern kann. Ich würde das gerne mit Hilfe der Funktion FindWindow() machen. Ich habe per Spy++ die entsprechenden Einträge gefunden und erziehle grundsätzlich auch schon die gewünschte Funktionalität, aber:

Unmittelbar nach dem Start der zu steuernden Anwendung können die entsprechenden Handles nicht gefunden werden. Ein Element liegt auf einer Toolbar. Das Handle auf die Toolbar ist immer da. Die "Childhandles" der Toolbar sind zunächst aber nicht sichtbar. (egal wie oft ich in Spy F5 drücke).

Inzwischen habe ich einen seltsammen reproduzierbaren Effekt entdeckt und ein Vorgehen entwickelt, um sie sichtbar zu machen: Ich klicke einmal in das entsprechende Feld in der zu steuernden Anwendung, drücke in Spy++ F5 (refresh) und bringe die Anwendung dann wieder in den Vordergrund. Ich erhalte dann augenblicklich den Wert des entsprechenden Handles per findWindow() und sehe es auch, wenn ich in Spy++ nochmal F5 drücke. Vor der Ausführung des beschriebenen Ablaufs erhalte ich als Handle 0.

Kann mir jemand diesen Effekt erklären bzw. sagen was Spy++ anstellt um das Handle sichtbar zu machen und wie ich das in meiner Anwendung nachstellen kann?

Vielen Dank

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Moin erstmal,

also ich hab das bisher so verstanden:

Du holst dir das handle als long durch spy++ und benutzt die findwindow() um das Fenster zu holen.

Eigentlich hätte ich dir jetzt auch Klotzkopps Vorschlag vorlegen wollen. Aber das scheint ja nicht zu funktionieren oO.

Hast du schon versucht, dir erst mit findwindowA() über die caption das handle zu holen und darauf hin das Fenster mit wiederum diesem handle?

Dann kannst du dir ja davon die child handles holen.

Vllt spuckt dir Spy++ irgendwie nicht das Richtige aus... wie auch immer.

Würde dann aber nicht erklären, warum dein Programm nach refresh von Spy++ funktioniert.

Das klingt vielleicht überflüssig, aber das Problem erscheint mir so merkwürdig, dass merkwürdige Lösungen den Erfolg bringen könnten :D

Und umso länger ich das schreibe, umso absurder erscheint mir mein Vorschlag, aber wer weiß.

Das Problem hat mich ziemlich neugierig gemacht. Solltest du irgendwann die Lösung finden, schreib sie doch bitte hier rein.

MfG,

Marco

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Sorry,

war wohl etwas missverständlich. Ich verwende Spy++ nur um die Name rauszukriegen. Die Handles hole ich mir genauso wie du das vorschlägst, mit findWindow und dann mit findWindowEx. Das von mir benötigte Handle ist in Ebene 4 das Baumes. Die Handles ab Ebene 3 kann ich allerdings nur finden, wenn ich vorher ein Refresh bei Spy gemacht habe. Das ist ja das Komische!!!

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Die Handles ab Ebene 3 kann ich allerdings nur finden, wenn ich vorher ein Refresh bei Spy gemacht habe.
Sind die Fenster zu diesen Handles denn vorher schon sichtbar? Vielleicht werden sie ja erst erzeugt, wenn man bestimmte Nachrichten an die Elternfenster schickt.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Sichtbar im Sinne von "ich kann sie auf der GUI sehen" ja. Was zum Kuckuck macht Spy++ da was ich nicht mache. Eben diese Nachrichten würde ich suchen!!!!

Vielleicht spricht Spy++ irgendwie die Form so an, dass sie einen repaint, validate oder dergleichen feuert. Dafür müsste man jetzt den Code von Spy++ vorliegen haben.

Etwas mehr Arbeit wäre es, sich selbst eine form zu schreiben welche die gleichen Ebenen an handles besitzt wie die form die dir gerade Probleme macht und einfach mal per eventhandling und debugger reinzugucken, was Spy++ da so macht.

EDIT:

Du solltest dir mit Spy++ selbst ansehen können, welche Nachrichten bei dem Elternfenster eingehen, wenn du in Spy++ ein Refresh machst. Eine davon wird wohl WM_GETTEXT sein.

Das ist natürlich ein kürzerer Weg :D

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

DANKE DANKE DANKE!!!! Eine Woche hat mich das finden dieser Antwort gekostet:

Ich schicke wie Klotzkopp gesagt hat ein WM_GETTEXT an das parent Handle und warte ein Bisschen. Dann sind die Children auf einmal sichtbar!

Super Idee mit Spy zu schauen, was es selbst tut! ;-)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Nimm an der Diskussion teil

Du kannst jetzt hier posten und Dich später registrieren. Wenn Du bereits über eine Konto verfügst, melde Dich jetzt an, um mit Deinem Konto zu posten.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.


Fachinformatiker.de, 2020 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung