Mega Code Archive

 
Categories / Delphi / System
 

How to enumerate windows and child windows

Title: How to enumerate windows and child windows 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;