Home | Software | Technologies | Clients | Printing | News | Delphi | Contact

Back to main page

{*****************************************************************************}
// The following is an example of how to enumerate windows and child windows
// and then load them into a TreeView component for display
//
// Author:     Pawel Michalowski, B.Sc.Cs.
// E-Mail:     pawel (at) michalowski (dot) net
// Web:        http://www.winshots.com/delphi/
//
// Copyright © 2009 Pawel Michalowski. All Rights Reserved.
// Copyright © 2009 Winshots Technologies, Inc. All Rights Reserved.
{*****************************************************************************}
{
  Disclaimer: The following code is FREE and it is provided on the "AS-IS" bases.
  Winshots Technologies or Pawel Michalowski will not take any responsibility
  whatsoever for any unwanted effects such as loss of profit, damage or otherwise
  caused by the use of this sample code.
  BY DOWNLOADING AND USING THIS SOURCE CODE, YOU INDICATE YOUR ACCEPTANCE OF THESE
  TERMS AND CONDITIONS.
}

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.

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;



Copyright © 1999-2009, Winshots Technologies, Inc. All Rights Reserved.