Форум: "WinAPI";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
ВнизEnumChildWindows ! Найти похожие ветки
← →
psa247 © (2005-11-08 13:40) [0]Пытаюсь перечислить все дочерние окна чужой программы и выстроить в виде дерева. Т.е. на примере, допустим было так: Форма -> Панель -> Checkbox, то выводит
+ Заголовок окна
|
+ Панель
| |
| Checkbox
|
Checkbox
Как сделать без лишних вложенностей, или чего-то я не понял?
+ Заголовок окна
|
+ Панель
|
Checkbox
← →
psa247 © (2005-11-08 13:56) [1]Вот код:
function ChildTree(ChildHand : HWND; Count : lParam): BOOL; stdcall;
var Text : array [0..256] of Char;
Curr, Par : TTreeNode;
ParHand : HWND;
begin
FillChar(text, 256, #0);
GetWindowText(ChildHand, text, 255);
if Text ="" then GetClassName(ChildHand, text, 255);
// Count - позиция родителя в дереве
// ChidHand - хендл текущего дочернего окна
ParHand:= Integer(F.tvList.Items[Count].Data);
Par:= F.tvList.Items[Count];
AddChild(ParHand, ChildHand, Count, text);
Curr:= F.tvList.Items.AddChildFirst(Par, Text);
Curr.Data:= TObject(ChildHand);
Result:= True;
end;
procedure TF.BuildTree;
var i : integer;
begin
tvList.Items.Clear;
EnumWindows(@ParentTree, 0);
for i:= 0 to tvList.Items.Count-1 do begin
tnParent:= tvList.Items[i];
EnumChildWindows(Integer(tvList.Items[i].Data), @ChildTree, i);
end;
end;
← →
Игорь Шевченко © (2005-11-08 14:27) [2]Попробуй:
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls;
type
TfMain = class(TForm)
TreeView: TTreeView;
procedure FormCreate(Sender: TObject);
private
procedure RefreshView;
end;
var
fMain: TfMain;
implementation
{$R *.DFM}
procedure TfMain.FormCreate(Sender: TObject);
begin
RefreshView;
end;
function GetWindowTextWorker (Wnd: HWND): string;
var
ClassName, Text: array[0..255] of char;
begin
GetClassName (Wnd, ClassName, SizeOf(ClassName));
GetWindowText (Wnd, Text, SizeOf(Text));
Result := Text + " ("+ClassName+")";
end;
type
TNodeData = record
TreeView: TTreeView;
TreeNode: TTreeNode;
ParentHandle: HWND;
end;
PNodeData = ^TNodeData;
function EnumChildWindowsProc (AWindowHandle: HWND;
Data: Pointer): BOOL; stdcall;
var
ChildNode: TNodeData;
begin
with PNodeData(Data)^ do begin
if GetParent(AWindowHandle) = ParentHandle then begin
ChildNode.TreeView := TreeView;
ChildNode.TreeNode := TreeView.Items.AddChild (TreeNode,
GetWindowTextWorker (AWindowHandle));
ChildNode.ParentHandle := AWindowHandle;
EnumChildWindows (AWindowHandle, @EnumChildWindowsProc, LParam(@ChildNode));
end;
end;
Result := true;
end;
function EnumWindowsProc (AWindowHandle: HWND; Data: Pointer): BOOL; stdcall;
var
NodeData: TNodeData;
begin
with TfMain(Data) do begin
NodeData.TreeView := TreeView;
NodeData.TreeNode := TreeView.Items.AddChild (nil,
GetWindowTextWorker (AWindowHandle));
NodeData.ParentHandle := AWindowHandle;
EnumChildWindows (AWindowHandle, @EnumChildWindowsProc, LParam(@NodeData));
end;
Result := true;
end;
procedure TfMain.RefreshView;
begin
EnumWindows (@EnumWindowsProc, LParam(Self));
end;
end.
← →
psa247 © (2005-11-08 14:45) [3]
> Игорь Шевченко
Спасибо. Исчерпывающий ответ.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.014 c