Как получить список окон потока
Решим эту задачу:
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 кБ).
Смотрите также:
|