Главная страница | назад





Article #17362: Getting an handle to a window in another application.

 Question and Answer Database

FAQ2362D.txt   Getting an handle to a window in another application.
Category   :Windows API
Platform    :All
Product    :All 32 bit  

Question:
How do I get the handle of another application's window and make
that window the active window?


Answer:
Using the Windows API function FindWindow() is the simplest and
most straightforward method of locating a given window provided you
know the exact window caption or class name. If you know only part of
the window's caption (ie: 'Netscape - ' + 'Some Unknown URL', you need
to use the Windows EnumWindows() function to enumerate all the active
windows, then call the Windows API functions GetWindowsText() and
GetClassName to see if you find a match for the window that you are
searching for.

The following example returns the window handle of the first window
enumerated that contains a partial match of the window title and an
exact match of the window's ClassName (if given) and brings that
window to the foreground.

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

function EnumWindowsProc(hWindow : hWnd;
                         lParam  : LongInt) : Bool
{$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
var
  lpBuffer : PChar;
  WindowCaptionFound : bool;
  ClassNameFound : bool;

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(Caption : string;
                     ClassName : string) : THandle;
var
  WindowInfo : TFindWindowStruct;

begin
  with WindowInfo do begin
    Caption := Caption;
    ClassName := ClassName;
    WindowHandle := 0;
    EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
    FindAWindow := 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;

7/16/98 4:31:28 PM
 

Last Modified: 01-SEP-99