Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Как нажать кнопку в чужой программе

Страницы: 1
Как нажать кнопку в чужой программе
В общем, я не то чтобы большой спец в программировании, но от этого не легче. И у меня сейчас проблема. Мне нужно из своего приложение нажать пару кнопок в чужой программе. А как это сделать не представляю. В Инете нарыл такие функции, что дальше делать и как их использовать ума не приложу

Код
 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;
Не мучайся. Есть куда более простой способ. Вот полностью рабочий, код

Код
procedure ClickOnForm(wnd: HWND; caption: string);
var
  TheChildHandle: HWND;
begin
  TheChildHandle := FindWindowEx(wnd, 0, nil, PChar(caption));
  SendMessage(TheChildHandle, WM_LButtonDown, 1, 1);
  SendMessage(TheChildHandle, WM_LButtonUP, 1, 1);
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  wnd: HWND;
  caption: string;
begin
  wnd := GetTopWindow(0);
  repeat
    SetLength(caption, GetWindowtextLength(wnd));
    GetWindowText(wnd, @caption[1], length(caption) + 1);

    if (trim(caption) = 'Form caption') then
      ClickOnForm(wnd, 'Button name');
    wnd := GetNextWindow(wnd, GW_HWNDNEXT);
  until wnd = 0;
end;
Спасибо. Но у меня ничего не происходит, как вообще задать какую кнопку нужно нажать. Ничего понять не могу.
Ну это же просто. Написал прямо в коде (см. 5-ую и 4-ую строчки снизу)
Код
procedure ClickOnForm(wnd: HWND; caption: string);
var
  TheChildHandle: HWND;
begin
  TheChildHandle := FindWindowEx(wnd, 0, nil, PChar(caption));
  SendMessage(TheChildHandle, WM_LButtonDown, 1, 1);
  SendMessage(TheChildHandle, WM_LButtonUP, 1, 1);
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  wnd: HWND;
  caption: string;
begin
  wnd := GetTopWindow(0);
  repeat
    SetLength(caption, GetWindowtextLength(wnd));
    GetWindowText(wnd, @caption[1], length(caption) + 1);

    if (trim(caption) = 'ЗДЕСЬ ЗАДАЕТСЯ ТЕКСТ В ЗАГОЛОВКЕ ФОРМЫ') then
      ClickOnForm(wnd, 'ЗДЕСЬ ЗАДАЕТСЯ ТЕКСТ КОТОРЫЙ НАПИСАН НА КНОПКЕ');
    wnd := GetNextWindow(wnd, GW_HWNDNEXT);
  until wnd = 0;
end; 
Спасибо большое теперь понятно. А так с любым элементом можно? Я хочу сказать могу я тоже самое например с картинкой сделать
Нет с картинкой так не получится. Так можно только с компонентами содержащими handle.
Еще раз спасибо, не буду больше надоедать.
Где-то читал, что можно лихо обращаться с любыми элементами (в т.ч. не имеющими дескриптора) внутри окна через IAccessible. Наглядных примеров на Делфи, к сожалению, не помню.

Мне так же еще известен более нубский способ клика по произвольному элементу (хорошо сработает, если размер окна приложения, которое ловим, менять нельзя):
1) Получаем координаты окна, например через GetWindowRect
2) Отсчитываем координаты до элемента, двигаем мышку через WM_SETCURSOR
3) Кликаем, вызывая WM_LBUTTONDOWN и WM_LBUTTONUP
Еще если для кнопки или пункта меню назначено сочетание клавиш. Очень не плохой вариант использовать его. При этом не нужно двигать мышкой и вообще будет не заметно каких-либо действий.Для того, чтобы это проделать нужно использовать функции WM_KEYDOWN, WM_KEYUP.
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)