Hallo!
Ich versuche eine fremde Anwendung sauber zu beenden.
Sagen wir einfach "notepad.exe".
Ich nutze GetWindowHandleByExeName um an das
Handle zu kommen und sende dann ein WM_CLOSE an das Fenster
PostMessage(GetWindowHandleByExeName('notepad.exe'), WM_CLOSE, 0, 0);
Das jedoch funktioniert erst beim zweiten oder dritten mal.
Die ersten male kommt ein anderes
Handle raus.
Wie kann das sein?
Hier der Code zu "GetWindowHandleByExeName":
Delphi-Quellcode:
var
WindowHandle: THandle;
h: HWND;
[...]
function MyEnumWindowProc(AHandle: THandle; LParam: LongWord): boolean;
stdcall;
var
ProcessID: THandle;
begin
ProcessID := 0;
GetWindowThreadProcessID(AHandle, ProcessID);
Result := not (ProcessID = LParam);
if not Result then
WindowHandle := AHandle;
end;
function GetWindowHandleByExeName(const AExeName: string): THandle;
var
SnapShot: THandle;
p: TProcessEntry32;
ProcessHandle: THandle;
begin
Result := 0;
WindowHandle := 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;
until (ProcessHandle <> 0) or not Process32Next(SnapShot, p);
EnumWindows(@MyEnumWindowProc, ProcessHandle);
Result := WindowHandle;
finally
CloseHandle(SnapShot);
end;
end;