Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Handle vom Control eines fremden Fensters ermitteln? (https://www.delphipraxis.net/49227-handle-vom-control-eines-fremden-fensters-ermitteln.html)

hitzi 7. Jul 2005 10:42


Handle vom Control eines fremden Fensters ermitteln?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

in dem Programm, welches ich fernsteuern möchte, geht eine Messagebox auf. In dieser müsste der Button "OK" gedrückt werden. Soweit alles kein Problem, wenn ich nur das Handle von dem Button herausbekommen könnte.

Mit dem Programm WinSpy kann man sich ja die Handles anzeigen lassen. Ein Screenshot mit dem Handle des Button hängt an dieser Message dran.

Das Handle von TApplication "Condor dedicated server" bekomme ich über Getwindow heraus.
Um nun an das Handle von dem Button zu kommen verwende ich folgenden Code (welcher bei dem Hauptfenster der fremden Anwendung ohne Probleme funktioniert):
Delphi-Quellcode:
dButton := FindWindowEx(dServerWindowHandle, 0, 'TspSkinButton', nil);
//dServerWindowHandle ist das Handle zu TApplication "Condor dedicated server"
Leider wird mir immer nur der Wert 0 zurückgeliefert. Wie kann ich das Handle dieses Button herausbekommen?

Luckie 7. Jul 2005 10:46

Re: Handle vom Control eines fremden Fensters ermitteln?
 
Das Parent des Buttons ist der MessagBox-Dialog und nicht das Hauotfenster der Anwnedung. Such also mit FindWindow die Messagebiox und dann mit dem Handle den Button mit FindWindowEx.

Jetzt ist der Anhang da. Eventuell hat der Button gar kein Handle, weil er von TGraphicControl abgeleitet ist, wie zum Beispiel der TSpeedButton, dann wirst du keine Chance haben.

hitzi 7. Jul 2005 11:17

Re: Handle vom Control eines fremden Fensters ermitteln?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich komm an das Handle 6620706 (TApplication). Wenn ich jetzt folgendes ausführe bekomme ich wieder Null zurück geliefert:
Delphi-Quellcode:
dMessageForm := FindWindowEx(dServerWindowHandle, 0, 'TspMessageForm', nil); //dServerWindowHandle = 6620706
Das ist kein Speedbutton, da ja WinSpy in dem Fall auch ein Handle für den OK Button zurückliefert.


EDIT: Im Anhang ist nochmal das ganze von Winsight aus betrachtet - inklusive Hauptfenster.

hitzi 7. Jul 2005 12:31

Re: Handle vom Control eines fremden Fensters ermitteln?
 
Selbst EnumChildWindows scheint nicht mit dem Handle des TApplication(siehe oben) zu funktionieren. Mit dem Handle des Hauptfensters funktionierts jedoch und ich bekomm alle Controls des Hauptfensters in die Stringlist.

Delphi-Quellcode:
function EnumProc(wnd: HWND; Lines: TStrings): BOOL; stdcall;
var buf : array[0..255] of char;
begin
  Result := True;
  GetClassName(wnd, buf, SizeOf(buf) - 1);
  Lines.Add(Format('%d,%s', [GetDlgCtrlID(wnd), buf]));
end;

//...
//Aufruf
  EnumChildWindows(dServerWindowHandle, @EnumProc, integer(WindowControls));
Beim Debugen sieht man, dass der nicht die Funktion EnumProc anspringt (was jedoch mit dem Handle des Hauptfensters funktioniert).

Irgendwie geh ich die Sache von der falschen Seite an ...

jfheins 7. Jul 2005 19:10

Re: Handle vom Control eines fremden Fensters ermitteln?
 
Hat nicht Winspy eine möglichkeit, den entsprechenden FindWindow-Code automatisch zu generieren ?
(In der Symbolleiste ganz rechts ;) )


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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