Как получить список всех окон
Данная программа находит все окна, созданные в системе 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]
Интересно, почему это не пойдет?!
← →
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 |
|
||
Опытный Профиль Репутация: нет
|
как можно найти все дочерние окна чужого приложения, если знаем тока Handle ———————
|
||
|
|||
x77 |
|
||
Эксперт Профиль Репутация: 19
|
а что считать дочерними окнами? вот так тебе пойдёт:
? ——————— Я никогда не сопротивлялся искушению, поскольку узнал: что мне |
||
|
|||
p0s0l |
|
||
Г-н Посол Профиль
Репутация: 58
|
Только x77 ненароком забыл написать stdcall у EnumChildProc… ——————— С уважением, г-н Посол. |
||
|
|||
x77 |
|
||
Эксперт Профиль Репутация: 19
|
p0s0l, это он могет, он такой ——————— Я никогда не сопротивлялся искушению, поскольку узнал: что мне |
||
|
|||
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, 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
Привет всем! Добавлено через 7 часов 47 минут
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 |
|||
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, опередил меня
0 |
59 / 59 / 4 Регистрация: 13.08.2011 Сообщений: 165 |
|
01.10.2011, 12:33 [ТС] |
4 |
Я вроде на Delphi просил, это не игра!
0 |
5694 / 2285 / 466 Регистрация: 20.11.2009 Сообщений: 7,692 Записей в блоге: 1 |
|
01.10.2011, 12:41 |
5 |
ia vrode na delphi prosil , ato ne igra это вообще 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(дескриптор) родительского окна нашёл? Или ещё его найти надо?
Ну, тут MyClass меняй на свой класс и всё…
0 |
MultiVan 59 / 59 / 4 Регистрация: 13.08.2011 Сообщений: 165 |
||||
01.10.2011, 13:58 [ТС] |
8 |
|||
MultiVan, так ты Handle(дескриптор) родительского окна нашёл? Или ещё его найти надо?
Ну, тут MyClass меняй на свой класс и всё… мне ну нужно менять классы , мне нужно найти и родительское чтобы найти дочернее! Добавлено через 32 секунды
0 |
deathNC 1904 / 1015 / 123 Регистрация: 08.12.2009 Сообщений: 2,792 Записей в блоге: 2 |
||||
01.10.2011, 14:42 |
9 |
|||
упс… пардон Не по теме: Мне показалось по началу, что в первом посте ты указал: класс и имя родительского окна известны.
Функция EnumWindows перечисляет все окна первого уровня. В параметрах ей нужно передать функцию вида, обрабатывающую некоторое очередное найденное окно, и передать любое число (на твоё усмотрение).
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. Если смогу, то переведу и выложу тут…
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 |
|||
Этот код ищет по куску класса
1 |
59 / 59 / 4 Регистрация: 13.08.2011 Сообщений: 165 |
|
02.10.2011, 00:06 [ТС] |
18 |
deathNC, Cпасибо , работает!
0 |
Все дочерние окна и процессы
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Из основной программы запускаем эксплорер (соответственно, иммем его хэндл), Юзер в браузере нажал шифт при клике на ссылку -> породился еще один эксплорер со своим окном…. Вопрос: Думаю, надо копать в сторону EnumChildWindows и EnumChildProc … Можете помочь кусочком рабочего кода? |
Antipich |
|
Через эти функции, по-моему, муднова-то. Проще в цикле проверять активное окно(GetForegroundWindow), далее получать его текст (GetWindowText(h:THandle)), и сравнивать, не эксплорер ли он. Function EnumChildProc(Handle:HWND; Param:LongInt):Boolean; stdcall; Procedure TForm1.Button1Click(Sender:TObject); Но я не уверен, что это именно то, что тебе надо. Так что прошу, если чё, меня строго не судить Сообщение отредактировано: Antipich — 13.01.03, 16:06 |
Song |
|
Вообщем решение есть, но мне его пока не написать по той причине что весь день на работе, а там даже компа нет пока, чтобы реализовать. Но если не терпится, можешь сам попробовать: 1.Запускаем сервер и браузер (ShellExecute). |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0525 ] [ 16 queries used ] [ Generated: 26.05.23, 04:51 GMT ]