function EnumChildProc(Wnd: hWnd; SL: TStrings): BOOL; stdcall; 
 var 
 szFull: array[0..MAX_PATH] of Char; //Buffer for window caption 
 begin 
 Result := Wnd <> 0; 
 if Result then 
 begin 
 GetWindowText(Wnd, szFull, SizeOf(szFull)); // put window text in buffer 
 if (Pos(SL[0], StrPas(szFull)) > 0) // Test for text 
 and (SL.IndexOfObject(TObject(Wnd)) < 0) // Test for duplicate handles 
 then SL.AddObject(StrPas(szFull), TObject(Wnd)); // Add item to list 
 EnumChildWindows(Wnd, @EnumChildProc, Longint(SL)); //Recurse into child windows 
 end; 
 end;  function ClickButton(ParentWindow: Hwnd; ButtonCaption: string): Boolean; 
 var 
 SL: TStringList; 
 H: hWnd; 
 begin 
 SL := TStringList.Create; 
 try 
 SL.AddObject(ButtonCaption, nil); // First item in list is text to find 
 EnumChildWindows(ParentWindow, @EnumChildProc, Longint(SL)); 
 H := 0; 
 case SL.Count of 
 1: ShowMessage('Window text not found.'); 
 2: H := hWnd(SL.Objects[1]); 
 else 
 ShowMessage('Ambiguous text detected.'); 
 end; 
 finally 
 SL.Free; 
 end; 
 Result := H <> 0; 
 if Result then PostMessage(H, BM_CLICK, 0, 0); 
 end; 
 // Rememeber the ampresand for underlined characters 
 // if the ‘c’ is underlined, then the text is ‘&click’