| 
      ...enumerate windows and child windows?
     | 
   
   
    | Autor: 
      Thomas Stutz     | 
   
  | [ Print tip 
] |   |   |   
 
 
 
 
type 
  PWindows = ^TWindows; 
  TWindows = record 
    WindowHandle: HWND; 
    WindowText: string; 
  end; 
 
type 
  TForm1 = class(TForm) 
    Button1: TButton; 
    TreeView1: TTreeView; 
    procedure Button1Click(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
 
var 
  Form1: TForm1; 
  PNode, CNode: TTreeNode; 
  AWindows: PWindows; 
 
implementation 
 
{$R *.DFM} 
 
function EnumChildWindowsProc(Wnd: HWnd; Form: TForm1): Bool; export; 
  {$ifdef Win32} stdcall; {$endif} 
var 
  Buffer: array[0..99] of Char; 
begin 
  GetWindowText(Wnd, Buffer, 100); 
  //if StrLen(Buffer)  0 then 
  if StrPas(Buffer) = '' then Buffer := 'Empty'; 
  new(AWindows); 
  with AWindows^ do 
  begin 
    WindowHandle := Wnd; 
    WindowText   := StrPas(Buffer); 
  end; 
 
  CNode := Form1.TreeView1.Items.AddChildObject(PNode, 
                 AWindows^.WindowText + ':' + 
                 IntToHex(AWindows^.WindowHandle, 8), AWindows); 
  if GetWindow(Wnd, GW_CHILD)  0 then 
  begin 
    PNode := CNode; 
    Enumchildwindows(Wnd, @EnumChildWindowsProc, 0); 
  end; 
  Result := True; 
end; 
 
function EnumWindowsProc(Wnd: HWnd; Form: TForm1): Bool; 
  export; {$ifdef Win32} stdcall; {$endif} 
var 
  Buffer: array[0..99] of Char; 
begin 
  GetWindowText(Wnd, Buffer, 100); 
  //if StrLen(Buffer)  0 then 
  if StrPas(Buffer) = '' then Buffer := 'Empty'; 
  new(AWindows); 
  with AWindows^ do 
  begin 
    WindowHandle := Wnd; 
    WindowText   := StrPas(Buffer); 
  end; 
 
  PNode := Form1.TreeView1.Items.AddObject(nil, AWindows^.WindowText + ':' + 
    IntToHex(AWindows^.WindowHandle, 8), AWindows); 
  EnumChildWindows(Wnd, @EnumChildWindowsProc, 0); 
  Result := True; 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  EnumWindows(@EnumWindowsProc, Longint(Self)); 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  Dispose(AWindows); 
end; 
 
end. 
 
 
{**********************************************} 
{  Other Code by NicoDE 
{**********************************************} 
 
type 
  PMyEnumParam = ^TMyEnumParam; 
  TMyEnumParam = record 
    Nodes: TTreeNodes; 
    Current: TTreeNode; 
  end; 
 
function EnumWindowsProc(Wnd: HWND; Param: PMyEnumParam): BOOL; stdcall; 
const 
  MyMaxName = 64; 
  MyMaxText = 64; 
var 
  ParamChild: TMyEnumParam; 
  ClassName: string; 
  WindowText: string; 
begin 
  Result := True; 
  SetLength(ClassName, MyMaxName); 
  SetLength(ClassName, GetClassName(Wnd, PChar(ClassName), MyMaxName)); 
  SetLength(WindowText, MyMaxText); 
  SetLength(WindowText, SendMessage(Wnd, WM_GETTEXT, MyMaxText, lParam(PChar(WindowText)))); 
  ParamChild.Nodes   := Param.Nodes; 
  ParamChild.Current := Param.Nodes.AddChildObject(Param.Current, 
    '[' + ClassName + '] "' + WindowText + '"' + ' Handle: ' + IntToStr(Wnd), Pointer(Wnd)); 
  EnumChildWindows(Wnd, @EnumWindowsProc, lParam(@ParamChild)); 
end; 
 
 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  Param: TMyEnumParam; 
begin 
  Param.Nodes := TreeView1.Items; 
  Param.Current := TreeView1.TopItem; 
  TreeView1.Items.BeginUpdate; 
  EnumWindows(@EnumWindowsProc, lParam(@Param)); 
  TreeView1.Items.EndUpdate; 
end; 
 
 
  
                       |