Пример EnumWindows

=== Пример EnumWindows ===
# Создайте форму и разместите на ней два компонента ListBox.
# Скопируйте код, показанный ниже.
# Запустите SysEdit.
# Запустите форму Delphi. Первый ListBox должен содержать список всех запущенных приложений. Дважды щелкните на SysEdit и нижний ListBox покажет дочернее MDI-окно программы SysEdit.
Paul Powers (Borland)
unit Wintask1;
interface
uses
 SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
 Forms, Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
 ListBox1: TListBox;
 ListBox2: TListBox;
 procedure FormCreate(Sender: TObject);
 procedure ListBox1DblClick(Sender: TObject);
 private
 function EnumListOfTasks(hWindow: hWnd): Bool; stdcall;
 function EnumListOfChildTasks(hWindow: hWnd): Bool; stdcall;
 end;
 THoldhWnd = class(TObject)
 private
 public
 hWindow: hWnd;
 end;
var
 Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
 EnumWindows(@TForm1.EnumListOfTasks, Longint(Self));
 if (ListBox1.Items.Count > 0) then
 ListBox1.ItemIndex := 0;
end;
function TForm1.EnumListOfTasks(hWindow: hWnd): Bool;
var
 HoldString: PChar;
 WindowStyle: Longint;
 IsAChild: Word;
 HoldhWnd: THoldhWnd;
begin
 GetMem(HoldString, 256);
 HoldhWnd := THoldhWnd.Create;
 HoldhWnd.hWindow := hWindow;
 WindowStyle := GetWindowLong(hWindow, GWL_STYLE);
 WindowStyle := WindowStyle and Longint(WS_VISIBLE);
 IsAChild := GetWindowWord(hWindow, GWW_HWNDPARENT);
 { Добавляем строку с текстом задачи или именем класса и дескриптор в ListBox1.Items }
 if (GetWindowText(hWindow, HoldString, 255) > 0)
 and (WindowStyle > 0) and (IsAChild = Word(nil)) then
 ListBox1.Items.AddObject(StrPas(HoldString), TObject(HoldhWnd))
 else if (GetClassName(hWindow, HoldString, 255) > 0)
 and (WindowStyle > 0) and (IsAChild = Word(nil)) then
 ListBox1.Items.AddObject(Concat('<', StrPas(HoldString), '>'), TObject(HoldhWnd));
 FreeMem(HoldString, 256);
 HoldhWnd := nil;
 Result := True;
end;
function TForm1.EnumListOfChildTasks(hWindow: hWnd): Bool;
var
 HoldString: PChar;
 WindowStyle: Longint;
 IsAChild: Word;
 HoldhWnd: THoldhWnd;
begin
 GetMem(HoldString, 256);
 HoldhWnd := THoldhWnd.Create;
 HoldhWnd.hWindow := hWindow;
 WindowStyle := GetWindowLong(hWindow, GWL_STYLE);
 WindowStyle := WindowStyle and Longint(WS_VISIBLE);
 IsAChild := GetWindowWord(hWindow, GWW_HWNDPARENT);
 { Добавляем строку с текстом задачи или именем класса и дескриптор в ListBox1.Items }
 if (GetWindowText(hWindow, HoldString, 255) > 0)
 and (WindowStyle > 0) and (IsAChild <> Word(nil)) then
 ListBox2.Items.AddObject(StrPas(HoldString), TObject(HoldhWnd))
 else if (GetClassName(hWindow, HoldString, 255) > 0)
 and (WindowStyle > 0) and (IsAChild = Word(nil)) then
 ListBox2.Items.AddObject(Concat('<', StrPas(HoldString), '>'), TObject(HoldhWnd));
 FreeMem(HoldString, 256);
 HoldhWnd := nil;
 Result := True;
end;
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
 EnumChildWindows(THoldhWnd(ListBox1.Items.Objects[ListBox1.ItemIndex]).hWindow, @TForm1.enumListOfChildTasks, Longint(Self));
 ListBox2.RePaint;
end;
end.
 Дополнено: Андрей Бреслав
 Сборник Kuliba
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 02112