Hallo Zusammen,
ich habe momentan ein Problem mit dem Ermitteln des Fensterhandle zu einer Exe.
Auf Basis der vielen Beispiele in Foren habe ich mir in Delphi 2007 die unten stehende Function erstellt, welche mir die Handles zu
allen Hauptfenstern einer angegebenen Exe ermittelt, auch wenn diese
mehrfach läuft.
Nur gibt es eine "Lücke". Wenn ich z.B. alle Fenster zu "winword.exe" suche, aber Word gerade minimiert in der Taskleiste liegt, so finde ich kein
Handle.
Kann mir bitte jemand erklären warum und wie ich diese Lücke schliessen kann?
Delphi-Quellcode:
type
THandleArray = array of HWND
function GetWindowHandlesByExeName(const AExeName: string): THandleArray;
type
PParam = ^TParam;
TParam = record
ProcID : THandle;
Res : THandleArray;
end;
var
SnapShot : THandle;
p : TProcessEntry32;
ProcessHandle : THandle;
Rec : TParam;
function MyEnumWindowProc(AHandle: THandle; _LParam: LParam): LongBool; stdcall;
var
ProcessID : THandle;
PHandle : THandle;
i : Integer;
g : Boolean;
begin
with PParam(_LParam)^ do
begin
ProcessID := 0;
GetWindowThreadProcessID(AHandle, ProcessID);
Result := not (ProcessID = ProcID);
if not Result then
begin
pHandle := GetParent(AHandle);
while pHandle <> 0 do
begin
AHandle := PHandle;
pHandle := GetParent(AHandle);
end;
g := False;
for i := low(Res) to high(Res) do
if Res[i] = AHandle then
g := True;
if not g then
begin
SetLength(Res, Length(Res) + 1);
Res[Length(Res)-1] := AHandle;
end;
end;
end;
end;
begin
SetLength(Rec.Res, 0);
ProcessHandle := 0;
p.dwSize := SizeOf(p);
SnapShot := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
try
if Process32First(SnapShot, p) then
repeat
if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then
ProcessHandle := p.th32ProcessID;
Rec.ProcID := ProcessHandle;
EnumWindows(@MyEnumWindowProc, Integer(@Rec));
until not Process32Next(SnapShot, p);
Result := Rec.Res;
finally
CloseHandle(SnapShot);
end;
end;