Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 441

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Уважаемые эксперты, я попробовал "заглянуть в чужие окна" в соответствии с рекомендациями, но что-то не совсем. Окно нахожу, нахожу в нем первое окно нижнего уровня, а дальше что-то не идет.Попадаю все время на одно и то же найденное окно нижнего уровня.
Тестовая формочка простая : кнопка и 2 Edit'а. Код приведен.
В чем моя ощибка?

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Яуген Таляныч Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Яуген Таляныч (статус: Посетитель)
Вопрос отправлен: 21 февраля 2009, 10:36
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, Гена Гутницкий!
procedure TForm1.Button1Click(Sender: TObject);
begin
HD := FindWindow(nil,'Beta');
Buf1:=StrAlloc(256);
Buf2:=StrAlloc(256);
HD1 := FindWindowEx(HD,0,nil,nil);
GetClassName(HD1,Buf1,256) ;
GetWindowText(HD1,Buf2,256) ;
ListBox1.Items.Add(Buf1);
ListBox1.Items.Add(Buf2);
Repeat
HD2 := GetNextWindow(HD1,gw_HWndNext);
if HD2<>0 then
begin
GetClassName(HD2,Buf1,256) ;
GetWindowText(HD2,Buf2,256) ;
ListBox1.Items.Add(Buf1);
ListBox1.Items.Add(Buf2);
HD1:=HD2;
end;
until HD2=0;
StrDispose(Buf1);
StrDispose(Buf2);
end;

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 21 февраля 2009, 19:29
Оценка за ответ: 5

Комментарий к оценке: Das ist fantastish! Оно работает даже под W-98.
Засада была в том, что я, найдя первое дочернее окно, не менял дескриптор в аргументе поиска ( думал, API ставит "птицу" на найденном дескрипторе и уже ищет следующий :-) , а это не так.)
  Но тут возникает другой вопрос : если найденное окно само
содержит дочерние (GroupBox), то как их искать? Подозреваю, что вместо gw_HWndNext нужно что-то другое.
Хотя это уже менее актуально : освоенным методом я колоссально расширил свои возможности.

Ответ #2. Отвечает эксперт: Градов Ю.М.

Здравствуйте, Гена Гутницкий! Попробуйте этот код. Он с комментариями - разберетесь.
procedure Tform1.GetAllWindow;
Var
Wd : HWnd;
begin
ListBox1.Items.Clear; // Очистим список перед началом поисков
Wd:=FindWindow(0,0); // Найдем первое окно верхнего уровня любого класса
While (Wd<>0) do // Если такое окно существует
Begin
ListBox1.Items.Add(IntToStr(Wd)); // Добавим описатель в виде текста в список
Application.ProcessMessages; // Дадим возможность поработать другим
Wd:=GetNextWindow(Wd,GW_HWNDNEXT); // Найдем следующее окно в системе.
End;
end;

Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 22 февраля 2009, 19:20
Оценка за ответ: 3

Комментарий к оценке: Речь в вопросе шла о поиске дочерних окон выбранного окна, а так получаем список всех открытых окон в системе.

Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 27 февраля 2009, 22:57; участников в обсуждении: 1.
Паровоз

Паровоз (статус: 10-ый класс), 21 февраля 2009, 19:05 [#1]:

"Код приведен"
Этот код вообще не должен работать. После
Buf1:=StrAlloc(256);
Buf2:=StrAlloc(256);
HD1 := FindWindowEx(HD,0,0,Buf1);
Вы передаете в FindWindowEx последним аргументом мусор.
Паровоз

Паровоз (статус: 10-ый класс), 22 февраля 2009, 19:48 [#2]:

"procedure Tform1.GetAllWindow"
Эта процедура дает не все окна, а только окна верхнего уровня.
Паровоз

Паровоз (статус: 10-ый класс), 27 февраля 2009, 22:57 [#3]:

"если найденное окно само содержит дочерние (GroupBox), то как их искать"
Нужно писать рекурсивную процедуру.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.03 сек.