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