Перечислить формы и дочерние формы

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

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;

{/codecitation}

Добавить комментарий