Jak przechwycić button z innej aplikacji?

0

Witam, mam takie pytanie.

Jak przechwycić button innej aplikacji znając uchwyt okna tak aby można kliknąć w button?

Czy jest to programowo możliwe aby np. w innej aplikacji kliknąć przycisk tej aplikacji.

Np. mając uruchomiony notatnik przy zamykaniu pojawia się komunikat:

"Zapisz" "Nie zapisuj" "Anuluj"

Czy można w jakiś sposób zasymulować kliknięcie w któryś button?

0

Jeżeli aplikacja jest napisana z użyciem (nie koniecznie bezpośrednim) WinAPI to tak.
Jeżeli nie to i tak można ale nie zawsze, z ograniczeniami itp.
Podaj więcej szczegółów.

0

Możesz mi napisać jak mam sprawdzić czy aplikacja wykorzystuje WinApi? To wtedy napiszę o jaką mi dokładnie chodzi.

2

Tak, jeżeli jest to standardowy przycisk jako kontrolka z własnym uchwytem. Wtedy należy uzyskać do niego uchwyt poprzez funkcje WinAPI jak EnumWindows i/lub EnumChildWindows. A później spróbować poprzez Post/SendMessage wysłać komunikat BM_CLICK lub WM_LBUTTOWNDOWN i później WM_LBUTTONUP. Więcej informacji na MSDNie oraz mnóstwie stron, które można wygooglować. Na pewno standardowe przyciski w MesageBoxie lub typowym dialogu, da sę zrobić bez problemów.

1

Windows Automation API
http://msdn.microsoft.com/en-us/library/windows/desktop/ff486375(v=vs.85).aspx

Writing automation to wait for a window to be created (and dismiss it)
http://blogs.msdn.com/b/oldnewthing/archive/2014/02/17/10500645.aspx

Adventures in automation: Dismissing all message boxes from a particular application but only if they say that the operation succeeded
http://blogs.msdn.com/b/oldnewthing/archive/2014/03/03/10504441.aspx

1

Ja klikam buttony przez nazwy np

 
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;

i wywołać np:

 
var windowhandle:hwnd;
begin
windowhandle:=Windows.GetForegroundWindow;
ClickButton(windowhandle,'Anuluj');
end;

czasami guzik ma skrót i podkreślnik pod literką 'A' więc daje:

ClickButton(windowhandle,'&Anuluj');

Wolności i sukcesów ;)

0

Mienio dzięki o to właśnie mi chodziło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1