|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите Перечисление всех окон
Суть программы очень простая - вывести в TreeView все окна + их дочерние окна сохраняя всю структуру. Мой вариант выводит многое, но говорят это не все окна. И под окном Delphi нет окон Object Inspector и т.д
Думаю ошибка в GetWindow(Handle,gw_child) - она не возвращает по хэндлу Delphi его дочерние окна, хотя по хэндлу Object Inspector - Delphi является родителем (GetParent(Handle)). Может есть другой способ получать дочернее окно? (GetTopWindow, EnumChildWindows - почему-то тоже не срабатывают так как требуется). P.S.: Добавил во вложения zip со своей прогой. Мой код: Код:
procedure Detka(H:hWnd;Tree:TTreeView; N:TTreeNode);{Хэндл окна с которого начинаем поиск, TreeView, Node родитель} var buff:ARRAY [0..255] OF Char;{ для хранения заголовков окон} PNode:TTreeNode;{Node для TreeView} begin While H<>0 do { пока успешно возвращается следующее окно} begin GetWindowText(H,buff,256); {получаем текст окна} PNode:=Tree.Items.AddChild(N ,buff);{записываем и запоминаем Node} Detka(GetTopWindow(H),Tree,PNode);{вызываем поиск дочернего, передаем Node родителя} H:= GetWindow(H, gw_hWndNext); {получаем следующее окно} end; end; procedure TForm1.Button1Click(Sender: TObject); begin TreeView1.Items.Clear; {очищаем TreeView перед добавлением} {хэндл первого окна на Z-уровне родителя нашего окна} Detka(GetWindow (GetWindow(Handle, gw_Owner), GW_HWNDFIRST) ,TreeView1,nil);{вызываем процедуру, передаем хэндл, TreeView, Node родитель} end; lmikle: пользуемся тегами!!! |
#2
|
|||
|
|||
Решил проблему...
Работает без использования 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. |