...
implementation
{$R *.dfm}
function EnumChildProc(Wnd: HWND; CaptList: TStrings): BOOL; stdcall;
var
captBuf: array[0..260] of Char;
begin
Result := (Wnd <> 0); // условие завершения обхода дерева окон
if Result then
begin
GetWindowText(Wnd, captBuf, SizeOf(captBuf)); // получаем заголовок (текст) окна
if (Pos(CaptList[0], StrPas(captBuf)) > 0) // проверяем не наше ли это окно
and (CaptList.IndexOfObject(TObject(Wnd)) < 0) // проверяем не заглядывали ли мы уже в это окошко
then CaptList.AddObject(StrPas(captBuf), TObject(Wnd)); // Добавляем в список заголовок и хэндл окна
EnumChildWindows(Wnd, @EnumChildProc, Longint(CaptList)); // Рекурсивный обход дочерних окон
end;
end;
function ClickButton(ParentWindow: HWND; ButtonCaption: string): Boolean;
var
Btn: HWND;
CaptList: TStringList; // В items-ы будем класть заголовки окон;
// в objects-ы будем класть хэндлы окон;
begin
CaptList := TStringList.Create;
try
// В первый item листа кладем заголовок кнопки
CaptList.AddObject(ButtonCaption, nil);
// обходим все дочерние окна (ищем кнопку с указанным ButtonCaption )
EnumChildWindows(ParentWindow, @EnumChildProc, Longint(CaptList));
// Убеждаемся что нашлась ТОЛЬКО ОДНА КНОПКА с указанным ButtonCaption
Result := ((CaptList.Count = 2) and (HWND(CaptList.Objects[1]) <> 0));
if Result then
begin
Btn := HWND(CaptList.Objects[1]);
PostMessage(Btn, BM_CLICK, 0, 0);
{ //или лучше
SendMessage(Btn, WM_LBUTTONDOWN, 1, 1);
SendMessage(Btn, WM_LBUTTONUP, 1, 1);
}
end;
finally
CaptList.Free;
end;
end;
...