Delphi как найти все дочерние окна

Как получить список всех окон

Данная программа находит все окна, созданные в системе Windows и отображает их на форме в виде дерева. Окна отображаются в виде узлов, а дочерние окна отображаются в виде дочерних узлов дерева.

На форму нужно поместить компонент дерева TTreeView (tv1) и кнопку TButton (btnEnum). В обработчике события нажатия на кнопку запишите:

procedure TForm1.btnEnum(Sender: TObject);
begin
  Screen.Cursor:= crHourGlass;
  try
    tv1.Items.Clear;
    EnumWindows(@EnumWindowsProc,0);
  finally
    Screen.Cursor:= crDefault;
  end;
end;

Здесь сначала мы очищаем TTreeView (tv1) и вызываем функцию EnumWindows, передавая ей функцию обратного вызова EnumWindowsProc, которая и будет делать основную работу по поиску окон и заполнение дерева.

Для начала функцию обратного вызова EnumWindowsProc нужно объявить:

{ ... }
var
  Form1: TForm1;

{ ... }

function EnumWindowsProc(Wnd: HWND; ParentNode: TTreeNode): Bool; stdcall;

Функция обратного вызова EnumWindowsProc:

function EnumWindowsProc(Wnd: HWND; ParentNode: TTreeNode): Bool; stdcall;
const
  ClassNameLen = 512;    // т.к. мы не знаем длину имени класса заранее, выделим достаточно места
var
  Text: string;                    // Заголовок окна
  TextLen: integer;           // Длина заголовка
  ClassName: array[0..ClassNameLen-1] of Char;    // буфер для имени класса
  Node: TTreeNode;
  NodeName: string;
begin
  Result:= true;
  // Будем искать только прямых потомков, остальные игнорируем
  if Assigned(ParentNode) and (GetParent(Wnd) <> HWND(ParentNode.Data)) then
    Exit;
  // Получаем длину заголовка окна
  TextLen:= SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
  // Устанавливаем длину строковой переменной
  SetLength(Text, TextLen);
  if TextLen > 0 then
    SendMessage(Wnd, WM_GETTEXT, TextLen+1, LParam(Text));
  // Слишком длинные строки обрезаем
  if TextLen > 100 then
    Text:= Copy(Text, 1, 100) + '  ' ;
  GetClassName(Wnd, ClassName, ClassNameLen);
  ClassName[ClassNameLen-1]:= #0;
  if Text = '' then
    NodeName:= 'Без названия (' + ClassName + ')'
  else
    NodeName:= Text + ' (' + ClassName + ') ';
  Node:= Form1.tv1.Items.AddChild(ParentNode, NodeName);
  Node.Data:= Pointer(Wnd);
  EnumChildWindows(Wnd, @EnumWindowsProc, LParam(Node));
end;

Вот и всё, Удачи!

Добавил(а): Tino Дата: 2016-11-05

 
Cobalt
 
(2002-02-09 15:37)
[0]

Помогите! Пытаюсь получить хэндл окна рабочего стола, точнее SysListView, который находится на ём, однако получаю какой-то мусор. Т.Е. хэндлы дочерних окон где-то в районе $44ff, тогда как SpyView показывает, что должен быть $11C. Имён классов окон тоже не получаю.



procedure TForm1.FormActivate(Sender: TObject);

var h2:HWND;

begin

h2:=FindWindow("Progman",nil);//То окно, на котором находится эксплореровский ListView.

i:=0;

EnumChildWindows(h2,@EnumDesktop,0);

end;

Function EnumDesktop(h:HWND;l:LParam):Bool;

var

c:PChar;

s:string;

begin

c:=StrAlloc(255);

GetClassName(h,c,255);

s:=strPas(c);

GetWindowText(h,c,255);

s:=s+strPas(c);

Form1.ListBox1.Items.Add(IntToStr(i)+":"+s+":"+IntToHex(H,6));

inc(i);

result:=true;

end;


 
SERGEYSA
 
(2002-02-09 23:16)
[1]

FindWindow не ищет дочерние окна, читай API описание

The
FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.

Тебе надо FindWindowEx

The FindWindowEx function retrieves the handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the given child window.

под NT непойдёт!!!!!


 
Raptor
 
(2002-02-10 00:07)
[2]

под NT непойдёт!!!!!

Интересно, почему это не пойдет?!


 
Cobalt
 
(2002-02-10 19:45)
[3]

Хрен с Progman_ом и FindWindow. Дело-то в EnumChildWindows

Глюки при обходе своей же формы!

procedure TForm1.FormActivate(Sender: TObject);

var h2:HWND;

begin

Form1.ListBox1.Items.Add(IntToHex(ListView1.Handle,6));

Form1.ListBox1.Items.Add(IntToHex(ListBox1.Handle,6));

Form1.ListBox1.Items.Add(IntToHex(Button1.Handle,6));

h2:=FindWindow("Progman",nil);

i:=0;

EnumChildWindows(Form1.Handle,@EnumDesktop,i);

ShowMessage(SysErrorMessage(GetLastError));

end;

Function EnumDesktop(h:HWND;l:LParam):Bool;

var c:PChar;

s:string;

begin

c:=StrAlloc(255);

s:=strPas(c);

Form1.ListBox1.Items.Add(IntToStr(l)+" "+IntToStr(i)+":"+s+":"+IntToHex(H,6));

inc(i);

result:=true;

end;

Итак, что получается в рез-те этих действий:

1) Получаю(ручками) хэндлы трёх своих контролов на форме.

2) Получаю какие-то цифры, которые, якобы, являются хэндлами дочерних окон моей формы, однако они все одинаковые (и, естественно, не совпадают с теми,что я получаю от VCL).

3) несовпадает даже

lParam
, которое является
application-defined value to be passed to the callback function.

Что примечательно:

Количество «чисел», которые я получаю в рез-те обхода, такое же, как и количество контролов на форме. z%((((


 
Raptor
 
(2002-02-10 21:09)
[4]

Нда-а. Сразу видно, что человек никогда не работал с энумераторами. :-))

А
stdcall где?!

Короче, обявляешь функцию так

Function EnumDesktop(h:HWND;l:LParam):Bool;stdcall;

Тогда все будет нормально работать.


 
Cobalt
 
(2002-02-11 00:40)
[5]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1013258264&n=5

2 Raptor © (10.02.02 21:09)

Агромадное спасибо!!!!!!!!

Усё работает!!!!!!!

П.С. Правильно ли я понял, что

все
функции (не только callback) в Windows —
Stdcall?



Форум программистов Vingrad

Новости ·
Фриланс ·
FAQ

Правила ·
Помощь ·
Рейтинг ·
Избранное ·
Поиск ·
Участники

Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Как найти все дочерние окна, чужого приложения 

:(

   

Опции темы

DriveSoftware
Дата 18.2.2004, 23:03 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 291
Регистрация: 17.3.2003

Репутация: нет
Всего: 4

как можно найти все дочерние окна чужого приложения, если знаем тока Handle

———————

user posted image
Замена стандартным Windows часам   

PM MAIL WWW ICQ   Вверх
x77
Дата 18.2.2004, 23:22 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
***

Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22

а что считать дочерними окнами?

вот так тебе пойдёт:

Код

function EnumChildProc (h: hWND; lParam: integer): boolean;
begin
 fMain.ListBox1.Items.Add (IntToStr (h));
 Result := TRUE;
end;

procedure TfMain.EnumChilds(h: hWND);
begin
 ListBox1.Items.Clear;
 EnumChildWindows (h, @EnumChildProc, 0);
end;

?

———————

Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)

PM MAIL ICQ   Вверх
p0s0l
Дата 19.2.2004, 18:26 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Г-н Посол
****

Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38′ с.ш. 4 9°41′ в.д.

Репутация: 58
Всего: 112

Только x77 ненароком забыл написать stdcall у EnumChildProc…

———————

С уважением, г-н Посол.

PM   Вверх
x77
Дата 20.2.2004, 11:15 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
***

Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22

p0s0l, это он могет, он такой smile.gif

———————

Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)

PM MAIL ICQ   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: Общие вопросы»
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

59 / 59 / 4

Регистрация: 13.08.2011

Сообщений: 165

1

Найти окно, зная часть имени его класса

01.10.2011, 12:26. Показов 10391. Ответов 17


Студворк — интернет-сервис помощи студентам

Привет всем!
Как найти Handle дочерное окно зная его имя(‘stop , please stop , don’t leave’); а класс нет ,
класс и имя родительское окна неизвестны!
Заранее спасибо!

Добавлено через 7 часов 47 минут
nu , kto pomojet?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

01.10.2011, 12:26

17

spydark91

86 / 86 / 13

Регистрация: 03.03.2011

Сообщений: 1,873

01.10.2011, 12:27

2

C++
1
2
3
4
5
6
7
HWND FindWindowEx
(
HWND hwndParent,        // дескриптор родительского окна
HWND hwndChildAfter,    // дескриптор дочернего окна
LPCTSTR lpszClass,      // указатель имени класса
LPCTSTR lpszWindow      // указатель имени окна
);

http://vsokovikov.narod.ru/New… ndowex.htm
но если эта игра браузерка,то в браузере вроде как окон нет,только те которые содержат странгицы(вкладки)



0



1904 / 1015 / 123

Регистрация: 08.12.2009

Сообщений: 2,792

Записей в блоге: 2

01.10.2011, 12:33

3

FindWindowEx попробуй, хотя я точно не помню

Добавлено через 24 секунды

Не по теме:

spydark91, :D опередил меня ;)



0



59 / 59 / 4

Регистрация: 13.08.2011

Сообщений: 165

01.10.2011, 12:33

 [ТС]

4

Я вроде на Delphi просил, это не игра!
p.s. Mob



0



5694 / 2285 / 466

Регистрация: 20.11.2009

Сообщений: 7,692

Записей в блоге: 1

01.10.2011, 12:41

5

Цитата
Сообщение от MultiVan
Посмотреть сообщение

ia vrode na delphi prosil , ato ne igra
p.s. Mob

это вообще API’шная функция, и нет такого определения в этом, дельфи это или с++ или вообще бесик, это функции видовса, и они работают в любом языке



0



59 / 59 / 4

Регистрация: 13.08.2011

Сообщений: 165

01.10.2011, 13:34

 [ТС]

6

Как найти дочернее окна если знаем её имя — «please stop» , и имя родитеское окно — «» , скорее всего у родительское оно пусто , а окна без имени в системе много!?



0



deathNC

1904 / 1015 / 123

Регистрация: 08.12.2009

Сообщений: 2,792

Записей в блоге: 2

01.10.2011, 13:53

7

MultiVan, так ты Handle(дескриптор) родительского окна нашёл? Или ещё его найти надо?
Если тебе ещё и родительское окно по классу найти надо, то:

Delphi
1
2
3
4
5
var
  Handle: HWND;
begin
  Handle := FindWindow('MyClass', nil);
end;

Ну, тут MyClass меняй на свой класс и всё…
Ну, а дальше юзай FindWindowEx
Вроде так надо…



0



MultiVan

59 / 59 / 4

Регистрация: 13.08.2011

Сообщений: 165

01.10.2011, 13:58

 [ТС]

8

Цитата
Сообщение от deathNC
Посмотреть сообщение

MultiVan, так ты Handle(дескриптор) родительского окна нашёл? Или ещё его найти надо?
Если тебе ещё и родительское окно по классу найти надо, то:

Delphi
1
2
3
4
5
var
  Handle: HWND;
begin
  Handle := FindWindow('MyClass', nil);
end;

Ну, тут MyClass меняй на свой класс и всё…
Ну, а дальше юзай FindWindowEx
Вроде так надо…

мне ну нужно менять классы , мне нужно найти и родительское чтобы найти дочернее!
Проблема в том что окна с пустым именем много
Но только одна имеет дочернее окна (‘Stop , please stop’);

Добавлено через 32 секунды
Как найти все окна без имени а потом во всех искать дочерную?



0



deathNC

1904 / 1015 / 123

Регистрация: 08.12.2009

Сообщений: 2,792

Записей в блоге: 2

01.10.2011, 14:42

9

упс… пардон

Не по теме:

Мне показалось по началу, что в первом посте ты указал: класс и имя родительского окна известны.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function EnumWindows_Callback(hWindow: HWnd; Param: LongInt): Boolean; stdcall;
var
  _can_continue: Boolean;
begin
  // hWindow - текущее окно в перечислении всех окон
  {
   тут ты проверяешь, подходит ли тебе окно или нет.
   Если да, то _can_continue нужно приравнять false
   иначе _can_continue надо приравнять к True;
  }
  // Возвращаем true чтобы продолжать перечисление:
  _can_continue := true;
  result := _can_continue;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  // перечисление всех окон первого урвня:
  EnumWindows(@EnumWindows_Callback, 0);
end;

Функция EnumWindows перечисляет все окна первого уровня. В параметрах ей нужно передать функцию вида, обрабатывающую некоторое очередное найденное окно, и передать любое число (на твоё усмотрение).
Функцию, которая передаётся в параметре, определяет, продлится ли поиск или нет. И там ты это как раз и будешь решать — подходит ли тебе hWindow или нет…



1



59 / 59 / 4

Регистрация: 13.08.2011

Сообщений: 165

01.10.2011, 14:52

 [ТС]

10

deathNC, Можеш дать пример а то с function ешё никогда не работал! )



0



1904 / 1015 / 123

Регистрация: 08.12.2009

Сообщений: 2,792

Записей в блоге: 2

01.10.2011, 15:02

11

Так я же дал пример выше…

Добавлено через 27 секунд

Не по теме:

Ладно, позже покажу, как полностью твою проблему решить… щас некогда…



1



59 / 59 / 4

Регистрация: 13.08.2011

Сообщений: 165

01.10.2011, 17:48

 [ТС]

12

хорошо!

Добавлено через 2 часа 43 минуты
………



0



1904 / 1015 / 123

Регистрация: 08.12.2009

Сообщений: 2,792

Записей в блоге: 2

01.10.2011, 18:00

13

Сейчас…

Не по теме:

думаю, как лучше реализовать…



0



59 / 59 / 4

Регистрация: 13.08.2011

Сообщений: 165

01.10.2011, 18:06

 [ТС]

14

Я UP темы сделал !



0



deathNC

1904 / 1015 / 123

Регистрация: 08.12.2009

Сообщений: 2,792

Записей в блоге: 2

01.10.2011, 19:45

15

эх… вот есть кусок кода на С, но на С я ещё ни одной проги не написал, так что трудно будет переводить в Delphi. Если смогу, то переведу и выложу тут…

C
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
#include <Windows.h>
#include <stdio.h>
 
#define MAX_BUFF_SIZE 256
#define BUFF_SIZE MAX_BUFF_SIZE * sizeof(WCHAR)
 
BOOL CALLBACK
EnumWins(HWND hWnd, LPARAM lParam);
 
BOOL CALLBACK
EnumChildWins(HWND hWnd, LPARAM lParam);
 
BOOL WINAPI
IsSearchingWindow(HWND hWnd);
 
// Найденный хэндл
HWND fndWindow;
PWCHAR text;
 
int main ()
{
    text = L"c:WindowsMicrosoft.NETFrameworkv2.0.50727>";
    EnumWindows(EnumWins, NULL);
 
    if (fndWindow != NULL)
        SendMessageW(fndWindow, WM_SETTEXT, NULL, (LPARAM)text);
 
    system("pause");
    return 0;
}
 
BOOL CALLBACK
EnumWins(HWND hWnd, LPARAM lParam)
{
    if (IsSearchingWindow(hWnd)) {
        fndWindow = hWnd;
        return FALSE;
    }
 
    EnumChildWindows(hWnd, EnumChildWins, NULL);
    return fndWindow == NULL;
}
 
BOOL CALLBACK
EnumChildWins(HWND hWnd, LPARAM lParam)
{
    if (IsSearchingWindow(hWnd))
        fndWindow = hWnd;
 
    return fndWindow == NULL;
}
 
BOOL WINAPI
IsSearchingWindow(HWND hWnd)
{
    BOOL retVal = FALSE;
    PWCHAR buffer = NULL;
    LONG capLength = SendMessageW(hWnd, WM_GETTEXTLENGTH, NULL, NULL) + 1;
 
    if (capLength > MAX_BUFF_SIZE)
        return;
 
    buffer = (PWCHAR)malloc(capLength * sizeof(WCHAR));
    capLength = SendMessageW(hWnd, WM_GETTEXT, capLength, (LPARAM)buffer);
 
    if (capLength != 0) {
        retVal = wcscmp(buffer, text) == 0;
    }
 
    free(buffer);
 
    return retVal;
}



1



59 / 59 / 4

Регистрация: 13.08.2011

Сообщений: 165

01.10.2011, 19:58

 [ТС]

16

Хорошо!



0



deathNC

1904 / 1015 / 123

Регистрация: 08.12.2009

Сообщений: 2,792

Записей в блоге: 2

01.10.2011, 21:44

17

Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
 
  public
    found_window: HWnd;
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function _GetWindowText(hWindow: HWnd): String;
var
  buf: Array[0..127] of Char;
  _size: Integer;
begin
  Result := '';
  _size := GetWindowText(hWindow, buf, SizeOf(buf));
  If _size = 0 then
    exit;
  GetWindowText(hWindow, buf, _size + 1);
  Result := StrPas(buf);
end;
 
{ коллбэк-функция проверки очередного найденного окна }
function EnumProc(hWindow: HWnd; Param: LongInt): Boolean; stdcall;
var
  buff: Array[0..255] of Char;
  s: String;
begin
  result := true;
  If Boolean(GetClassName(hWindow, buff, 256)) then
    begin
      s := AnsiLowerCase(StrPas(buff));
      If pos(AnsiLowerCase('ApplicationForm'), s) > 0 then // вот тут ищем кусок класса
        begin
          Form1.found_window := hWindow;
          Result := False;
        end;
    end;
end;
 
{ Обработчик клика по кнопке Button1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
  found_window := Invalid_Handle_Value;
  // перечисление всех окон первого урвня:
  EnumWindows(@EnumProc, 0);
  If found_window <> Invalid_Handle_Value then
    ShowMessage(_GetWindowText(found_window));
end;
 
end.

Этот код ищет по куску класса



1



59 / 59 / 4

Регистрация: 13.08.2011

Сообщений: 165

02.10.2011, 00:06

 [ТС]

18

deathNC, Cпасибо , работает!



0



>
Все дочерние окна и процессы

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
13.01.03, 12:12

    Из основной программы запускаем эксплорер (соответственно, иммем его хэндл),
    и подсовываем ему на вход нужный html-файл.

    Юзер в браузере нажал шифт при клике на ссылку -> породился еще один эксплорер со своим окном….
    Допустим, наплодили мы кучу новых окон от родительского браузера.
    Теперь начинаем их закрывать…

    Вопрос:
    как главная программа _без_использования_хуков может узнать,
    что _все_ дочерние окна/процессы закрыты, в том числе и окно «главного» браузера?
    После закрытия всех порожденных окон наша программа должна завершиться сама.

    Думаю, надо копать в сторону EnumChildWindows и EnumChildProc …

    Можете помочь кусочком рабочего кода?


    Antipich



    Сообщ.
    #2

    ,
    13.01.03, 16:00

      Через эти функции, по-моему, муднова-то. Проще в цикле проверять активное окно(GetForegroundWindow), далее получать его текст (GetWindowText(h:THandle)), и сравнивать, не эксплорер ли он.
      По-моему, все окна эксплорера-это отдельные процессы, а не дочерние окна главного. Поэтому EnumChildWindows(или как там она) не подойдёт. Но я могу и ошибаться.
      А сли я ошибаюсь, то так:
      сначала определяешь хандел родительского эксплорера(это, надеюсь, ты сможешь), например он будет h.
      А далее так:

      Function EnumChildProc(Handle:HWND; Param:LongInt):Boolean; stdcall;
      Begin
      {сюда через переменную Handle будут передаваться все дочерние окна, а там уже проверяй заголовок окна, если он есть(у кнопок его естественно нет, а они сюда тоже передадуться)}
      Result:=True;
      End;

      Procedure TForm1.Button1Click(Sender:TObject);
      Begin
      EnumChildWindows(h,@EnumChildProc,0);
      End;

      Но я не уверен, что это именно то, что тебе надо. Так что прошу, если чё, меня строго не судить :)

      Сообщение отредактировано: Antipich — 13.01.03, 16:06


      Song



      Сообщ.
      #3

      ,
      13.01.03, 17:42

        Вообщем решение есть, но мне его пока не написать по той причине что весь день на работе, а там даже компа нет пока, чтобы реализовать. Но если не терпится, можешь сам попробовать:

        1.Запускаем сервер и браузер (ShellExecute).
        2.Подождём пока загрузится страница в браузер — WaitForInputIdle()
        3.Читаем дискриптор окна браузера — GetForeGroundWindow и определяем его класс, ну типа TOpera :-))
        4.Запускаем нить — TThread, которая будет сканировать все верхние окна — EnumWindows(), на предмет того, есть ли окно с классом, который мы нашли на шаге 3.
        5.Если после перебора всех окон, такого окна не нашлось, значит все экземпляры таких окон (то бишь все окна браузера) закрыты.Закрываем сервер.
        6.Разрушаем поток.

        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

        0 пользователей:

        • Предыдущая тема
        • Delphi: Общие вопросы
        • Следующая тема

        [ Script execution time: 0,0525 ]   [ 16 queries used ]   [ Generated: 26.05.23, 04:51 GMT ]  

        Понравилась статья? Поделить с друзьями:
      • Как найти друзей в дурака онлайн
      • Как найти местоположение телефона iphone
      • Как найти площадь ромба известны только стороны
      • Как найти скорость импульса после взаимодействия
      • Как найти деньги на отдых