Счетчик HotLog

На главнуюЧто я делаю...Программы автора и не только...Творчество
Статьи автораКнига отзывов и предложенийОбо мне, любимомФотоальбом

 
 

Как получить список окон потока

Решим эту задачу:

uses
  Classes, StrUtils, Windows;

// Заполнить список окон потока.
procedure FillThreadWindowList(
  // Список окон.
  const WindowList: TStringList); forward;

// Callback-функция перебора окон потока.
function EnumThreadWndProc(
  // Дескриптор окна.
  hwnd: HWND;
  // Дополнительный параметр.
  lParam: LPARAM): BOOL; stdcall; forward;

procedure FillThreadWindowList(const WindowList: TStringList);
begin
  EnumThreadWindows(GetCurrentThreadId, @EnumThreadWndProc, LPARAM(WindowList));
end;

function EnumThreadWndProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
  WindowList: TStringList;
  WindowClassName: String;
  WindowClassNameLength: Integer;
begin
  // Calback-функция вызывается до тех пор, пока не кончатся окна или
  // callback-функция не вернет False.
  Result := True;
  WindowList := TStringList(lParam);
  // Длина MAX_PATH выбрана случайно, ее должно хватить в подавляющем большинстве случаев.
  SetLength(WindowClassName, MAX_PATH);
  WindowClassNameLength := GetClassName(hwnd, PAnsiChar(WindowClassName), MAX_PATH);
  WindowList.Add(LeftStr(WindowClassName, WindowClassNameLength));
end;

Почему-то список получился маленьким, окон гораздо больше. А дело вот в чем: приведенный код возвращает список окон потока верхнего уровня, дочерние окна в него не попадают. Для получения дочерних окон нужно доработать callback-функцию.

Сигнатура callback-функции для EnumChildWindows аналогична EnumThreadWindows, потому передадим указатель на эту же функцию:

uses
  Classes, StrUtils, Windows;

// Заполнить список окон потока.
procedure FillThreadWindowList(
  // Список окон.
  const WindowList: TStringList); forward;

// Callback-функция перебора окон потока.
function EnumThreadWndProc(
  // Дескриптор окна.
  hwnd: HWND;
  // Дополнительный параметр.
  lParam: LPARAM): BOOL; stdcall; forward;

procedure FillThreadWindowList(const WindowList: TStringList);
begin
  EnumThreadWindows(GetCurrentThreadId, @EnumThreadWndProc, LPARAM(WindowList));
end;

function EnumThreadWndProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
  WindowList: TStringList;
  WindowClassName: String;
  WindowClassNameLength: Integer;
begin
  // Calback-функция вызывается до тех пор, пока не кончатся окна или
  // callback-функция не вернет False.
  Result := True;
  WindowList := TStringList(lParam);
  // Длина MAX_PATH выбрана случайно, ее должно хватить в подавляющем большинстве случаев.
  SetLength(WindowClassName, MAX_PATH);
  WindowClassNameLength := GetClassName(hwnd, PAnsiChar(WindowClassName), MAX_PATH);
  WindowList.Add(LeftStr(WindowClassName, WindowClassNameLength));
  // Получим дочерние окна.
  EnumChildWindows(hwnd, @EnumThreadWndProc, lParam);
end;

Теперь список получился полным.

Вы можете скачать исходники демонстрационного проекта (Delphi 7) (2.5 кБ).

Смотрите также:

 
 

18.09.2007

 
     
Hosted by uCoz