![]() |
Handle einer Anwendung heraus finden um diese fernzusteuern
Hallo,
zu diesem Thema gibt es bereits viele Threads, dennoch scheint das hier ein Spezielfall zu sein, den ich so noch nirgends gelesen habe. Mit WinSpy habe ich mir den Code generieren lassen um die Buttons zu drücken die ich drücken wollte....und es funktionierte. Der erste Schritt ist mit
Delphi-Quellcode:
das handle auszulesen und von dort an weiter in der Hierarchie bis zu den gewünschten Steuerelementen zu kommen.
wndMain := FindWindow('<Klassenname>','<Fenstertitel>');
Nachdem ich die Remote-Anwendung neu gestartet habe, ging es aber nicht mehr, denn bei jedem Neustart der Anwendung ändert sie ihren Klassennamen(!). Dieser ist sowas wie 'Afx:00400000:b:00010007:00000006:172A11EF'. Und wenn ich keinen Klassennamen angebe (also nil), dann bekomme ich ein anderes Handle zurück mit dem der Rest auch nicht mehr funktioniert. Wie schaffe ich es dennoch ohne den Klassennamen wissen zu können das richtige handle zu bekommen? danke |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Zitat:
![]() ![]() PS, Google sagt: ![]() ![]() |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Wenn die Anwendung ihren Fenstertitel nicht ändert, dann eventuell FindWindow ohne Klassenname, nur mit Fenstertitel
Oh, hab gerade in #1 gesehen, dass es dann nicht funktioniert. |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Vergiss es dynamisches wechseln des Klassen namens verhindert ein Auffinden des Fensters.
Habe ich früher mal mit UEDIT versucht das Programm macht genau das selbe. Zumindest macht es keinen sinn da etwas speichern zu wollen weil nicht fix. gruss |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Nur so ein Gedanke und leider etwas umständlich: mit EnumWindows alle Top-Level-Fenster durchgehen, mit GetWindowThreadProcessID die zugehörige ProzessID ermitteln, die man dann für CreateToolHelp32 verwenden kann, um die zugehörige Exe herauszufinden. Den Dateinamen muss man dazu natürlich wissen. Ob das so klappt, habe ich nicht versucht, aber einen Versuch ist es wert.
|
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Alternativ könntest du das Programm auch über dein eigenes Tool starten, eine DLL injecten und dann direkt die gewünschten Operationen ausführen. Die Handles bekommst du dann z.B. indem du
![]() ![]() |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Zitat:
Selbst wenn du die Anwendung selbst startest und somit die Kontrolle darüber hast wird es ohne Hook nichts nutzen. Aber.. habe es damit selbst schon versucht und sein lassen weil es die Anwendung ausreizt die hat mehr mit dem Hook zu tun als mit anderen Dingen. gruss |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Nach Ostern such ich Dir eine Funktion raus, die nach dem .exe Prozess sucht und Dir dessen Handles gibt.
Solange sich der .exe Name nicht auch jedesmal ändert, klappt es. Das Problem was Du dann lösen musst ist folgendes, finde heraus welches Handle das gesuchte ist, meine Funktion liefert nur alle mit dem Prozess verbundenen. Falls Dir sowas weiterhelfen kann such ich Montag mal. |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Zitat:
![]() Jedoch erhalte ich damit auch nicht das gesuchte Handle. Ich hatte dann vermutet dass mein gesuchtes Handle ein Child-Handle ist dass ich mit EnumChildWindows raus kriege, doch ein solch erstellter Callback wird nie aufgerufen... |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Und wenn Du den Code dahingehend erweiterst, dass er nicht beim ersten gefundenen Fenster aufhört, sondern die ermittelten Fensterhandles in einer Liste ablegt? Es kann ja mehrere Fenster je Prozess geben, evtl. findest Du nur das falsche.
|
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Die frage die da noch wäre was möchtest du machen denn davon ist es abhängig ob es überhaupt funktionieren kann.
Wenn du es so machen möchtest und in eine INI speicherst dann geht es definitiv nicht denn der Klassenname ändert sich ja immer. Zitat:
Wenn ohne speichern dann geht es nur über Hook oder einer Funktion welche immer und zu jeder zeit EnumWindows ausführt und dir Die Handles in einer Stringliste oder der gleichen abspeichert. Da kannst du dann anhand des Fenster Titel vergleichen. ![]() ![]() Starte die Anwendung die Probleme macht. Vorher natürlich mein Example. Dann klicke auf Fensterlist und wähle aus der Combo das Programm. Sollte das Programm über Menüs verfügen solltest du diese damit steuern können. Vielleicht hilft es dir ja. gruss |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Den Wininspector bekomme ich nicht geladen, da erscheint nur spamm wenn ich auf Download klicke.
Ich selbst bin Fan von -=Assarbad=- & Eugen Honeker's EDA Programm. @EWeiss: Dein Tool macht genau was du sagt, also klappt prima, nur irgendwie funktioniert ein Maximieren/Resize nicht. |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Zitat:
EDIT: Ach so du meinst die Form selbst.. ja das soll so sein siehe AutoSize = True. Habe lediglich vergessen zusätzlich noch BorderIcons [biMaximize] auszuschalten. Aber darum geht es hier nicht ist nur ein Sample für den Thread Ersteller damit er prüfen kann ob er das Handle der Anwendung findet. Zitat:
Winspector arbeitet in Realzeit und gibt alle Messagen inklusive Handle des gesamten System aus. gruss |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
|
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
Zitat:
Was anderes kann ich dir dazu nicht mehr sagen. @Fukiszo.. Wird auch langsam OT das ganze. Bin raus. gruss |
AW: Handle einer Anwendung heraus finden um diese fernzusteuern
der Tipp mit Winspector war Gold wert. Danke.
Der hat mir aufgezeigt, dass von den etlichen Child-Prozessen meiner zu steuernden exe, 2 Prozesse den Fenstertitel hatten nach dem ich mit FindWindow gesucht habe. Und natürlich ist erst der zweite Prozess den, den ich brauche. Wenn ich den FindWindowEx ein zweites mal ausführe mit dem Child-Handle des zuvor gefundenen Handles, dann kriege ich was ich brauche :thumb:
Delphi-Quellcode:
danke für eure Unterstützung.
wndMain := FindWindowEx(0,0,nil,'<Fenstertitel>');
wndMain := FindWindowEx(0,wndMain,nil,'<Fenstertitel>'); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz