Нашёл пример на C, не могу переписать на Delphi
Кратко о навигации по окнам:
У каждого окна (формы) как правило есть дочерние окна, т.е. объекты, находящиеся на этой форме. Каждого из этих объектов могут быть свои дочерние объекты, а у тех свои и т.д. Вот пример иерархии вложенности:
...................Главная______фор ма..........................
.................../........................... \........................
............Панель N1 ................. Панель N2...............
.........../........... \.................. /.............\..............
....нопка N1 .... Кнопка N2 ... Панель N3 ... Кнопка N3
................................... ......./................................
................................... Кнопка N4..........................
Таким образом навигацию по окнам можно сравнить с навигацией по файловой системе.
Раз у вас уже есть хэндл (назовём его hMain) "Главной формы", то остаётся "добраться" до нужной кнопки. Сделать это можно так:
Напишем рекурсивную функцию, которая будет обходить наше "оконное дерево", ища кнопку с именем "Кнопка N3". Вид функции:
HWND Walk(HWND Current,char * Name);
Где-нибудь в программе делаем вызов target=Walk(hMain,"Кнопка N3").
Код:
Код: Выделить всё
HWND Walk(HWND Current,char * name)
{
HWND temp;
temp=GetWindow(Current,GW_CHILD); // находим первое дочернее окно
while (temp!=NULL) // проверяем, а есть ли оно вообще
{
char WindowText[1024];
GetWindowText(temp,WindowText,1023); // получаем его название
if (!strcmp(name,WindowText)) return temp; // проверяем, искомая ли это кнопка, если да, то возвращаем её хэндл
HWND result=Walk(temp,name); // если это была не она, то обходим её дочерние объекты
if (result!=NULL) return result; // если при этом искомый объект был найден, возвращаем хэндл на него
temp=GetWindow(temp,GW_HWNDNEXT) // иначе - проверяем следующий объект, дочерний для Current
}
return NULL; // объект не найден
}
Если в окне на который указывет хэндл hMain есть объект с именем "Кнопка N3", эта функция вернёт его хэндл, иначе - NULL.
Если обект найден, то на него осталось только нажать:
SendMessage(target,WM_LBUUTONDOWN,0 ,0);
И "отжать" его:
SendMessage(target,WM_LBUUTONUP,0,0 );