Главная страница
    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
2-1135529108
Вопрос
2005-12-25 19:45
2006.01.15
Как получить список файлов в опр дериктории?


14-1134725654
sax_ol
2005-12-16 12:34
2006.01.15
задача для 6 класса


2-1135690645
Proxytel
2005-12-27 16:37
2006.01.15
Эмуляция мыши


14-1135225381
konda
2005-12-22 07:23
2006.01.15
Чем потестировать компьютер?


2-1135260029
тт
2005-12-22 17:00
2006.01.15
Как узнать имя папки в которую установлена windows?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский