Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1132100889
Silver...
2005-11-16 03:28
2006.01.15
TRIGGER ... Access


2-1135254448
kotbazilio
2005-12-22 15:27
2006.01.15
TDateTimePicker


2-1135352750
kop
2005-12-23 18:45
2006.01.15
DBMemo


14-1135250639
saNat
2005-12-22 14:23
2006.01.15
Написание программ для ОС Windows в *nix


1-1134159570
Free0n
2005-12-09 23:19
2006.01.15
Кто может и кого возникнут оригинальные идеи посоветуйте...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский