Получить дескриптор окна другого приложения и сделать его активным в Delphi

Использование функции Windows API FindWindow() — простейший способ нахождение окна, при условии, что известен его заголовок или имя оконного класса. Если Вам известна только часть заголовка окна (например ‘Netscape — ‘ + ‘какой-то неизвестный URL’), Вам нужно использовать функцию EnumWindows() для получения всех окон, затем вызывать функцию GetWindowsText() и GetClassName для поиска нужного окна. Следующий пример находит первое окно, содержащее совпадающую часть заголовка окна и полностью совпадающее название оконного класса (если он задан) и делает это окно активным.

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; 
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (10 оценок, среднее: 5,00 из 5)
Загрузка...
Добавить комментарий