Home » Tipps & Tricks » System » Prozesse » Fensterhandle anhand des Exe-Namens erhalten

Fensterhandle anhand des Exe-Namens erhalten

Will man ein Fensterhandle einer Anwendung bekommen, von der nur der Exe-Name und nicht der Fenstertitel bekannt ist, kann folgender Code verwendet werden:

uses TLHelp32;

var
  WindowHandle: THandle;

function MyEnumWindowProc(AHandle: HWND; LParam: LongWord): BOOL;
stdcall;
var
  ProcessID: DWORD;
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;

Wenn die Funktion GetWindowThreadProcessId unter älteren Delphi-Versionen einen Fehler verursacht, muss folgender Code ergänzt werden:

function GetWindowThreadProcessId(hWnd: HWND; var dwProcessId: DWORD): DWORD;
stdcall; external 'user32.dll' name 'GetWindowThreadProcessId';