|
В данной статье будет приведен пример того, как можно из своего приложения нажать на кнопку в другом приложении. Вложенность форм внутри приложения любая. Заголовок главной формы динамический и постоянная его часть только первое слово "Касса". Достоверно нам известен 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; |