
17.02.2011, 00:24
|
Прохожий
|
|
Регистрация: 19.01.2011
Сообщения: 24
Репутация: 10
|
|
Решил проблему...
Работает без использования GetWindow(Handle,gw_child).
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
TreeView1: TTreeView;
Button1: TButton;
Panel2: TPanel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
{запись для сортировки в TreeView}
WindRec=record
Text:string;
Handle:hWnd;
end;
{запись для работы с TreeView}
TreeRec=record
Handle:HWND;
Node:TTreeNode;
end;
procedure GetOkna(H:hWnd);
procedure Sort;
procedure Chld(PH:hWnd;PNode:TTreeNode);
var
Form1: TForm1;
Wind:Array of WindRec;
Tree:Array of TreeRec;
implementation
{$R *.dfm}
{заполнение массива}
procedure GetOkna(H:hWnd);
var
buff:ARRAY [0..255] OF Char;
begin
While H<>0 do
begin
GetWindowText(H,buff,256);
SetLength(Wind,Length(Wind)+1);
Wind[Length(Wind)-1].Text:=buff;
Wind[Length(Wind)-1].Handle:=H;
GetOkna(GetTopWindow(H));
H:= GetWindow(H, gw_hWndNext);
end;
end;
{только для вывода дочерних окон}
procedure Chld(PH:hWnd;PNode:TTreeNode);
var
i:Integer;
PHc:HWND;
PNodeC:TTreeNode;
begin
for i:=0 to Length(Wind)-1 do
begin
IF ( GetParent (Wind[i].Handle)<>0 ) AND (GetParent (Wind[i].Handle) = PH) THEN
begin
PnodeC:=Form1.TreeView1.Items.AddChild(PNode,Wind[i].Text);
PHc:=Wind[i].Handle;
{записываем Node для работы с TreeView}
SetLength(Tree,Length(Tree)+1);
Tree[Length(Tree)-1].Handle:=PH;
Tree[Length(Tree)-1].Node:=PNode;
Wind[i].Handle:=0;
Chld(PHc,PNodeC);
end;
end;
end;
{только для не имеющих родителя}
procedure Sort;
var
I:Integer;
PNode:TTreeNode;
PH:hWnd;
begin
for i:=0 to Length(Wind)-1 do
begin
IF (Wind[i].Handle<>0) AND(GetParent(Wind[i].Handle)=0) Then
begin
PNode:=Form1.TreeView1.Items.Add(nil,Wind[i].Text);
PH:=Wind[i].Handle;
{записываем Node для работы с TreeView}
SetLength(Tree,Length(Tree)+1);
Tree[Length(Tree)-1].Handle:=PH;
Tree[Length(Tree)-1].Node:=PNode;
Wind[i].Handle :=0;
Chld(PH,PNode);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear; {очищаем TreeView перед добавлением}
SetLength(Tree,0);
SetLength(Wind,0);
{хэндл первого окна на Z-уровне родителя нашего окна}
GetOkna( GetWindow (GetWindow(Handle, gw_Owner), GW_HWNDFIRST) );
Sort;
end;
end.
|