www.twoysoft.ru
создание сайтов
программное обеспечение
обслуживание компьютеров
компьютерные сети
о нас
хостинг
полезные программы
портфолио
Отзывы клиентов
Статьи
Как нажать на кнопку в чужом приложении
В данной статье будет приведен пример того, как можно из своего приложения нажать на кнопку в другом приложении. Вложенность форм внутри приложения любая. Заголовок главной формы динамический и постоянная его часть только первое слово "Касса". Достоверно нам известен caption кнопки. Ниже пример того как это реализуется на delphi, но в связи с тем, что основные функции это  API функции, то переложить пример на C++ не составляет никакого труда.

type
               PFindWindowStruct = ^TFindWindowStruct;
               TFindWindowStruct = record
                 Caption : string;
                 WindowHandle : THandle;
               end;

 

function EnumChildWindowsProc(hWindow : hWnd; lParam  : LongInt) : Bool
             {$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
             var
               lpBuffer : PChar;
               WindowCaptionFound : bool;
             begin
               GetMem(lpBuffer, 255);
               Result := True;
               WindowCaptionFound := False;
             
               try
                 if GetWindowText(hWindow, lpBuffer, 255) > 0 then
                   if Pos(pChar('Ярусы'), StrPas(lpBuffer)) > 0
                    then WindowCaptionFound := true;
                 if WindowCaptionFound  then begin
                   PFindWindowStruct(lParam).WindowHandle := hWindow;
                   Result := False;
                 end;

               finally
                 FreeMem(lpBuffer, sizeof(lpBuffer^));
               end;
             end;
             
function EnumWindowsProc(hWindow : hWnd; lParam  : LongInt) : Bool
             {$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
             var
               lpBuffer : PChar;
               WindowCaptionFound : bool;
             begin
               GetMem(lpBuffer, 255);
               Result := True;
               WindowCaptionFound := False;
             
               try
                 if GetWindowText(hWindow, lpBuffer, 255) > 0 then
                   if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0
                    then WindowCaptionFound := true;


                 if WindowCaptionFound  then begin
                   PFindWindowStruct(lParam).WindowHandle := hWindow;
                   Result := False;
                 end;

               finally
                 FreeMem(lpBuffer, sizeof(lpBuffer^));
               end;
             end;

function FindAWindow(fCaption : string) : THandle;
             var
               WindowInfo : TFindWindowStruct;
             begin
               with WindowInfo do begin
                 Caption := fCaption;
                 WindowHandle := 0;
                 EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
                 FindAWindow := WindowHandle;
               end;
             end;


function FindYarus(fhwnd : THandle) : THandle;
             var
               WindowInfo : TFindWindowStruct;
             begin
               with WindowInfo do begin
                 Caption := 'Ярусы'; // указываем, то что написано на искомой кнопке      

                 WindowHandle := 0;
                 EnumChildWindows(fhwnd, @EnumChildWindowsProc, LongInt(@WindowInfo));
                 //EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
                 FindYarus := WindowHandle;
               end;
             end;


procedure TForm1.Button1Click(Sender: TObject);
 var TheWindowHandle : THandle;
     TheYarusWindowHandle : THandle;
begin
  TheWindowHandle := FindAWindow('Касса');// указываем слово в заголовке главного окна
               if TheWindowHandle = 0 then
                 ShowMessage('Window Not Found!')
                 else
                 begin
                 BringWindowToTop(TheWindowHandle);
TheYarusWindowHandle :=FindYarus(TheWindowHandle);
                 end;
if TheYarusWindowHandle = 0 then
                 ShowMessage('Window Not Found!')
                 else PostMessage(TheYarusWindowHandle, BM_CLICK, 0, 0);
end;