|
Открытые окна
#32248271
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Готовая программа:
На форме:
Tree: TTreeView;
Grid01: TStringGrid;
Status: TStatuBar;
MainMenu1
PopUpmenu1
Imagelist1
Скачал не помню где
Unit1:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList, Menus, ActnList, StdCtrls, Grids;
type
// тип для хранения информации об окне
TNode=record
Handle:THandle;// хэндл окна
Text:string[ 255 ];// текст окна
CName:string[ 255 ];// имя класса
Menu:HMenu;// хендл меню
end;
PNode=^TNode;
// порядок работы
{Буфер типа PChar
1 StrAlloc - резервируем область
2 DisposeStr - удалить буфер
3 StrPas - для передачи в Delphi
}
type
TForm1 = class(TForm)
Tree: TTreeView;
Status: TStatusBar;
MainMenu1: TMainMenu;
ImageList1: TImageList;
N1: TMenuItem;
N2: TMenuItem;
Grid01: TStringGrid;
PopupMenu1: TPopupMenu;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
Setactivewindow1: TMenuItem;
procedure N2Click(Sender: TObject);
procedure TreeClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure Setactivewindow1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure FillTree;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// процедура заполнения дерева
procedure TForm1.FillTree;
var
h,h1:THandle;
Buffer:PChar;
// рекурсивная процедура заполнения дерева
procedure RegisterWindow(hWnd:THandle;ParentTreeItem:TTreeNode);
var
Node:PNode; // данные окна
TreeNode:TTreeNode; // узел дерева
h:THandle; // хэндл окна, промежуточная переменная
begin
// получение и сохранение информации об окне
// создание переменной информации обокне
New(Node);
// присвоение дескриптора
Node^.Handle:=hWnd;
// получение текста окна
GetWindowText(hWnd,Buffer, 256 );
Node^.Text:=Trim(StrPas(Buffer));
// получение класса окна
GetClassName(hWnd,Buffer, 255 );
Node^.CName:=Trim(StrPas(Buffer));
// получение дескриптора меню окна
Node^.Menu:=GetMenu(hWnd);
// размещение в дереве
TreeNode:=Tree.Items.AddChild(ParentTreeItem,'');
// присвоение отображаемого текстового значения
if Node^.Text<>'' then TreeNode.Text:=Node^.Text
else if Node^.CName<>'' then TreeNode.Text:=Node^.CName
else TreeNode.Text:=IntToStr(Node^.Handle);
// сохранение ссылки на информацию об окне в соответствующем узле дерева
TreeNode.Data:=Node;
// Рекурсивные вызовы получение подчинённых элементов
h:=GetWindow(hWnd,gw_Child);
if h<> 0 then
RegisterWindow(h,TreeNode);
// получение элеметов того же уровня
h:=GetWindow(hWnd,gw_hWndNext);
if h<> 0 then
RegisterWindow(h,ParentTreeItem);
end;
begin
// сообщение в строке статуса
Status.SimpleText:='Обновление информации об окнах ...';
Application.ProcessMessages;
// выключение отображения изменений дерева
Tree.Items.BeginUpdate;
// очистка дерева
Tree.Items.Clear;
// создание буфера для работы с PChar
Buffer:=StrAlloc( 256 );
// Получаем хэндл текущего окна
h1:=Handle;
repeat
// получаем хэндл окна-владельца
h:=GetWindow(h1,GW_OWNER);
// если не окно верхнего уровня, то ищем дальше
if h<> 0 then begin
h1:=h;
end;
until h= 0 ;
// находим первое верхнее окно
h:=GetWindow(h1,GW_HWNDFIRST);
// запуск рекурсии
RegisterWindow(h,nil);
// задание выделенного элемента дерева
Tree.Selected:=Tree.Items[ 0 ];
// включение отображения изменений дерева
Tree.Items.EndUpdate;
// удаление буфера для работы с PChar
StrDispose(Buffer);
// сообщение в строке статуса
Status.SimpleText:='Готово.';
end;
procedure TForm1.N2Click(Sender: TObject);
begin
FillTree;
end;
procedure TForm1.TreeClick(Sender: TObject);
begin
with Grid01 do
Begin
Cells[ 0 , 1 ]:='Handle';
Cells[ 1 , 1 ]:=IntTOstr(TNode(Tree.Selected.Data^).Handle);
Cells[ 0 , 2 ]:='Text';
Cells[ 1 , 2 ]:=TNode(Tree.Selected.Data^).Text;
Cells[ 0 , 3 ]:='Class';
Cells[ 1 , 3 ]:=TNode(Tree.Selected.Data^).CName;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Grid01.ColWidths[ 0 ]:= 100 ;
Grid01.ColWidths[ 1 ]:= 200 ;
FillTree;
end;
procedure TForm1.N3Click(Sender: TObject);
begin
ShowWindow(TNode(Tree.Selected.Data^).Handle,sw_Show);
end;
procedure TForm1.N4Click(Sender: TObject);
begin
ShowWindow(TNode(Tree.Selected.Data^).Handle,sw_Hide);
end;
procedure TForm1.N5Click(Sender: TObject);
begin
PostMessage(TNode(Tree.Selected.Data^).Handle,wm_Close, 0 , 0 );
Tree.Items.BeginUpdate;
FillTree;
Tree.Items.EndUpdate;
end;
procedure TForm1.Setactivewindow1Click(Sender: TObject);
var ExtData: TRect;
begin
GetWindowRect(TNode(Tree.Selected.Data^).Handle,ExtData);
ShowMessage('Left:' + IntTOStr(ExtData.Left) + ''# 10 # 13 +
'Top:' + IntToStr(ExtData.Top) + ''# 10 # 13 +
'Right' + IntToStr(ExtData.Right) + ''# 10 # 13 +
'Bottom' + IntToStr(ExtData.Bottom));
end;
end.
|
|
|