![]() |
Problem mit FindWindowEx - Klasse #32770 macht Probleme
Zuersteinmal Hallo - mein erster Post ;)
Ich möchte: 1. Programm starten 2. einen (Default-)Button Klick simulieren 3. warten, bis das Programm idlet 4. eine aufploppende MsgBox (Infobox, nur OK-Button) beenden 5. Programm beenden 1 krieg ich hin. Für 2 nutze ich PostMegssage mit vk_return. bei 3 versuch ich es mit "WaitForInputIdl". Und 5 würde ich wieder mit Postmessage (tab und dann return) regeln. Doch richtig, nur würde ... denn 4 bereitet mir arge Probleme. Ich krieg es auf biegen und brechen nicht hin, das handle dieses buttons der Infobox zu bekommen :( Ich kriege das Handle der Infobox einfach nicht heraus. Gebe ich dessen Handle an, krieg ich mit FindWindowEx wunderbar das handle des Buttons und kann ihn auch betätigen. Doch irgendwie scheint die Klasse der Box ('#32770') ein Problem dar zu stellen.
Code:
Damit hab ich es versucht - jedoch ohne Erfolg.
wnd := FindWindowEx(wnd,0,'#32770','fat GUI');
Code:
Wenn ich das entsprechende Handle der Box direkt angebe, findet er mit dieser Zeile den Button.
wnd := FindWindowEx(handle,0,'Button','OK');
Wäre über Hilfe dankbar ;) Gruß Malte |
Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
Willst du damit:
Delphi-Quellcode:
Ds Handle der Messagebox bekommen?
wnd := FindWindowEx(wnd,0,'#32770','fat GUI');
![]() ![]() |
Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
Man kann bei FindWindowEx aber auch einfach 0 als Handle für das Parent-Fenster angeben, dann verhält sich FindWindowEx genauso wie FindWindow.. falls du trotzdem noch Probleme haben solltest probiers mal mit der Ersatz-Funktion die ich mir gebastelt hab - FindWindow(Ex) ermitteln den Window-Text nämlich per GetWindowText und das kann Probleme geben.. (siehe PSDK)
Delphi-Quellcode:
function XSpy_FindWindowEx(WndParent: HWND; WndChildAfter: HWND;
lpszClass: PChar; lpszWindow: PChar): HWND; type TEnumWndRec = record lpszClass: PChar; lpszWindow: PChar; Wnd: HWND; WndParent: HWND; WndChildAfter: HWND; bChildFound: Boolean; end; var aEnumWndRec: TEnumWndRec; function GetClassName(Wnd: HWND): String; var szBuffer: array [0..255] of Char; begin ZeroMemory(@szBuffer, SizeOf(szBuffer)); Windows.GetClassName(Wnd, szBuffer, SizeOf(szBuffer)); Result := String(szBuffer); end; function GetWindowText(Wnd: HWND): String; var dwResult: DWord; pBuffer: PChar; begin dwResult := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0) + 1; pBuffer := GetMemory(dwResult); try SendMessage(Wnd, WM_GETTEXT, dwResult, Integer(pBuffer)); Result := String(pBuffer); finally FreeMemory(pBuffer); end; end; function EnumCallBack(Window: HWND; var aRec: TEnumWndRec): Boolean; stdcall; var bMatches: Boolean; begin Result := True; if (aRec.WndParent <> 0) and (aRec.WndParent <> GetAncestor(Window, GA_PARENT)) then Exit; if (aRec.WndChildAfter <> 0) and not aRec.bChildFound then begin aRec.bChildFound := aRec.WndChildAfter = Window; Exit; end; bMatches := True; if Assigned(aRec.lpszClass) then bMatches := String(aRec.lpszClass) = GetClassName(Window); if bMatches and Assigned(aRec.lpszWindow) then bMatches := String(aRec.lpszWindow) = GetWindowText(Window); if bMatches then begin aRec.Wnd := Window; Result := False; end; end; begin Result := 0; if (WndParent <> 0) and not IsWindow(WndParent) then Exit; aEnumWndRec.lpszClass := lpszClass; aEnumWndRec.lpszWindow := lpszWindow; aEnumWndRec.Wnd := 0; aEnumWndRec.WndParent := WndParent; aEnumWndRec.WndChildAfter := WndChildAfter; aEnumWndRec.bChildFound := False; if WndParent = 0 then EnumWindows(@EnumCallBack, Integer(@aEnumWndRec)) else EnumChildWindows(WndParent, @EnumCallBack, Integer(@aEnumWndRec)); Result := aEnumWndRec.Wnd; end; |
Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
crazy ... japs - cool :D
Da fragt man sich den ganzen tag durch ... und landet am Ende des Abends dann hier so schnell bei der Lösung. Hätte ich auch mal vorher probieren können :( edenfalls kenn ich nun die Parameter der FindWindowEx auswednig ;) :hello: :hello: Das nächste Problem aber ist nun, dass ich den Button irgendwie netmehr bestätigt bekomme :( Hab es mit Postmessage und Sendmessage und mit bm_click sowie keydown mit vk_return probiert. Wie komm ich hier weiter? edit: Danke Motzi, hab deinen beitrag aber erst nach meinem gelesen. Hab jedoch mittels WinSpy die handles verglichen und da hat er schon die korrekten gefunden. |
Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
Findest du auch das richtige Fenster? Alle Dialoge die mit dem Ressourcen-Editor vom VS gemacht wurden, haben standardmäßig die Klasse #32770.
|
Re: Problem mit FindWindowEx - Klasse #32770 macht Probleme
grml, wieder zu spät, hehe
Ja, hab ich mit WinSpy verglichen und die handles die mein programm auswirft sind mit den dort angezeigten identisch. Ich suche ja nach Klasse und Titel. edit: hmm, der machts bei exakt jedem 2. Versuch¿? die ahndles sind bei beiden versuchen die gleichen?!? Also, wenn ich
Code:
ausführe (also 2x nacheinander) klappts, sonst wird der button irgendwie erst einmal dick und erst danach klappts.
postMessage(wnd,bm_click,0,0);
postMessage(wnd,bm_click,0,0); Muss sich da noch nen Focus setzen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 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