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;