powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Открытые окна
3 сообщений из 3, страница 1 из 1
Открытые окна
    #32246453
Rousso
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Народ, подскажите плз. Полгода не писал на Дельфях, а щас приспичило.
Как получить список открытых окон(запущенных программ)? Большое спасибо всем за ответы :))
...
Рейтинг: 0 / 0
Открытые окна
    #32246599
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EnumWindows, например
...
Рейтинг: 0 / 0
Открытые окна
    #32248271
Lt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lt
Гость
Готовая программа:
На форме:
Tree: TTreeView;
Grid01: TStringGrid;
Status: TStatuBar;
MainMenu1
PopUpmenu1
Imagelist1
Скачал не помню где

Unit1:
Код: plaintext
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.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Открытые окна
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]