Home » Tipps & Tricks » System » Prozesse » Handle auf ein Fenster einer anderen Anwendung bekommen

Handle auf ein Fenster einer anderen Anwendung bekommen

Am einfachsten ist es, die Windows-API-Funktion FindWindow zu verwenden, um ein bestimmtes Fenster zu lokalisieren – vorausgesetzt, man kennt den genauen Fenstertitel oder den Klassennamen. Wenn man nur einen Teil des Fenstertitels kennt (z.B. ‚Netscape – ‚ + irgendeine unbekannte URL), muss die Funktion WindowsEnumWindows verwendet werden, um alle aktiven Fenster zu erfassen. Anschließend wird mit den Funktionen GetWindowsText und GetClassName geprüft, ob ein Fenster dabei ist, nachdem gesucht wird.Der folgende Code gibt das Handle des ersten Fensters zurück, dessen Fenstertitel teilweise und dessen Klassenname exakt (wenn angegeben) mit den Suchangaben übereinstimmt, und bringt es in den Vordergrund.

type
  PFindWindowStruct = ^TFindWindowStruct;
  TFindWindowStruct = record
    Caption: string;
    ClassName: String;
    WindowHandle: THandle;
end;

function EnumWindowsProc(hWindow: hWnd; lParam: LongInt): boolean; stdcall;
var lpBuffer: PChar;
    WindowCaptionFound: boolean;
    ClassNameFound: boolean;
begin
  GetMem(lpBuffer, 255);
  result:=true;
  WindowCaptionFound:=false;
  ClassNameFound:=false;
  try
    if GetWindowText(hWindow, lpBuffer,255)>0 then
      if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer))>0
      then WindowCaptionFound:=true;
    if PFindWindowStruct(lParam).ClassName='' then
      ClassNameFound:=true
      else if GetClassName(hWindow, lpBuffer, 255)>0 then
        if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer))>0
        then ClassNameFound:=true;
    if (WindowCaptionFound and ClassNameFound) then begin
      PFindWindowStruct(lParam).WindowHandle:=hWindow;
      result:=false;
    end;
  finally
    FreeMem(lpBuffer, sizeof(lpBuffer^));
  end;
end;

function FindAWindow(WinCaption: string; WinClassName: string): THandle;
var WindowInfo: TFindWindowStruct;
begin
  with WindowInfo do begin
    caption := WinCaption;
    className := WinClassName;
    WindowHandle := 0;
    EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
    result := WindowHandle;
  end;
end;

procedure TForm1.Button1Click(sender: TObject);
var TheWindowHandle: THandle;
begin
  TheWindowHandle:=FindAWindow('Netscape -', '');
  if TheWindowHandle=0 then
    ShowMessage('Window not found!')
  else
    BringWindowToTop(TheWindowHandle);
end;