Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.15;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.026 c
6-1128514703
pazitron_brain
2005-10-05 16:18
2006.01.15
IntraWeb в Delphi


14-1135142731
begin...end
2005-12-21 08:25
2006.01.15
С Днём рождения! 21 декабря


2-1135712663
Катерина
2005-12-27 22:44
2006.01.15
исключения


14-1135166865
konda
2005-12-21 15:07
2006.01.15
Глюк в Outlook Express


6-1128346174
kay
2005-10-03 17:29
2006.01.15
Как сделать, чтобы при использовании InternetConnect и прочих...