Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Handle einer Anwendung heraus finden um diese fernzusteuern (https://www.delphipraxis.net/195838-handle-einer-anwendung-heraus-finden-um-diese-fernzusteuern.html)

Friday 30. Mär 2018 12:57

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:
wndMain := FindWindow('<Klassenname>','<Fenstertitel>');
das handle auszulesen und von dort an weiter in der Hierarchie bis zu den gewünschten Steuerelementen zu kommen.

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

himitsu 30. Mär 2018 13:02

AW: Handle einer Anwendung heraus finden um diese fernzusteuern
 
Zitat:

Zitat von Friday (Beitrag 1397665)
bekomme ich ein anderes Handle

MSDN-Library durchsuchenFindWindowEx oder MSDN-Library durchsuchenEnumWindows

PS, Google sagt:
https://msdn.microsoft.com/en-us/library/btbxa0ad.aspx
https://www.experts-exchange.com/que...omponents.html

Amateurprofi 30. Mär 2018 13:04

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.

EWeiss 30. Mär 2018 14:07

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

DeddyH 30. Mär 2018 17:17

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.

Zacherl 30. Mär 2018 18:58

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 MSDN-Library durchsuchenCreateWindow oder sowas wie MSDN-Library durchsuchenRegisterClass hookst.

EWeiss 30. Mär 2018 20:58

AW: Handle einer Anwendung heraus finden um diese fernzusteuern
 
Zitat:

Zitat von Zacherl (Beitrag 1397688)
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 MSDN-Library durchsuchenCreateWindow oder sowas wie MSDN-Library durchsuchenRegisterClass hookst.

Wie schon gesagt da du selber weist das sich das Handle immer ändert wird es ohne Hook wie hier vorgeschlagen nicht funktionieren.
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

KodeZwerg 30. Mär 2018 23:03

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.

Friday 31. Mär 2018 09:17

AW: Handle einer Anwendung heraus finden um diese fernzusteuern
 
Zitat:

Zitat von KodeZwerg (Beitrag 1397716)
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.

Danke, aber das macht die Funktion hier schon: https://www.delphi-treff.de/tipps-tr...mens-erhalten/

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...

DeddyH 31. Mär 2018 09:36

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.

EWeiss 31. Mär 2018 10:18

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:

[Visual Basic]
ArbPfad=
FensterTitel=Project1 - Microsoft Visual Basic [design]
KlassenName=wndclass_desked_gsk
Sollte sich der Fenster Titel ändern dann ebenfalls nicht.

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.
Winspector

sorry möchte noch auf mein Programm hinweisen.
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

KodeZwerg 31. Mär 2018 12:06

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.

EWeiss 31. Mär 2018 12:08

AW: Handle einer Anwendung heraus finden um diese fernzusteuern
 
Zitat:

nur irgendwie funktioniert ein Maximieren/Resize nicht.
Bei mir schon ;)
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:

Ich selbst bin Fan von -=Assarbad=- & Eugen Honeker's EDA Programm.
Unbrauchbar weil es im Grunde nichts tut.

Winspector arbeitet in Realzeit und gibt alle Messagen inklusive Handle des gesamten System aus.

gruss

KodeZwerg 31. Mär 2018 12:45

AW: Handle einer Anwendung heraus finden um diese fernzusteuern
 
Für alle die Winspector testen wollen und das gleiche Download Problem haben das da nur Spamm erscheint, hier hab ich es her, gefunden über Quelle.

EDA = Unbrauchbar, naja, je nachdem was man erreichen will denke ich mal. Ich mag es.

EWeiss 31. Mär 2018 13:17

AW: Handle einer Anwendung heraus finden um diese fernzusteuern
 
Zitat:

EDA = Unbrauchbar, naja, je nachdem was man erreichen will denke ich mal. Ich mag es.
Vergleich die beiden Programme dann sag mir wer mehr kann.
Was anderes kann ich dir dazu nicht mehr sagen.

@Fukiszo.. Wird auch langsam OT das ganze.
Bin raus.

gruss

Friday 31. Mär 2018 14:36

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:
  wndMain := FindWindowEx(0,0,nil,'<Fenstertitel>');
  wndMain := FindWindowEx(0,wndMain,nil,'<Fenstertitel>');
danke für eure Unterstützung.


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