|
Вопрос # 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), то как их искать"
Нужно писать рекурсивную процедуру.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|