Управление чужим приложением

altВведение

Скажу сразу, примеры приводимые в этой статье не легкие, но и не простые. Поэтому рекомендую прочитать из других источников, ну конечно и не забываем про наш сайт, немного о WinAPI. Хотя бы наглядно, начинающему пользователю будет трудно сразу определиться, что есть что. Хотя я по максимуму постараюсь объяснить все детали этого нелегкого дела, вернее процесса конструирования своей программы…

Какинг — это просто?

Ну что, давайте для начала попробуем найти чужое окно. Это нам позволит сделать функция «FindWindow», которая имеет два параметра: хэндл окна и собственно имя объекта.

FindWindow(nil,’Form1′);

Здесь мы ищем приложение, в заголовке которого красуется надпись «Form1». Ну и собственно хэндл оставляем пустым — nil. Теперь опишем процедуру, которая будет эмулировать действие нажатия кнопки в чужом приложении. Переписывай следующее:

procedure ClickFormButton(wnd: HWND; caption: string);
var
wnd: HWND;
begin
//поиск окна
wnd:= FindWindowEx(wnd, 0, nil, PChar(caption));
//сообственно посылаем чужому приложению
//сообщение о нажатии на кнопку
SendMessage(wnd, WM_LButtonDown, 1, 1);
SendMessage(wnd, WM_LButtonUP, 1, 1);
end;
Но играться будет со своим приложением: кидай на форму кнопку и таймер. По событию OnTimer прописывай содержимое листинга 1. Итак, по срабатыванию таймера, будет проводиться поиск окна с названием «Form1» (вот здесь нам и пригодилась функция поиска окна…), Окно найдено?, тогда нажимаем кнопку с названием «Button1», ну и собственно продолжаем поиск активного окна, с теми параметрами как и предыдущий поиск.

Листинг1:
procedure TForm1.Timer1Timer(Sender: TObject);
var
wnd: HWND;
caption: string;
begin
wnd:= GetTopWindow(0);
repeat
if FindWindow(nil, ‘Form1’) 0 then then //заголовок формы, здесь лучше искать форму как предлагали выше
ClickFormButton(wnd, ‘Button2’); //надпись на кнопке, ты пишешь ту которая необходима…
wnd := GetNextWindow(wnd, GW_HWNDNEXT);
until wnd = 0;
end;
Теперь определимся с тектовым полем (возьмем Edit). Для передачи сообщения текстовому полу Вам нужно знать хэндл (идентификатор, дискриптор) окна, котороу будет происходить передача сообщения.

SendMessage(Edit1.Handle,WM_SETTEXT, 0, Integer(pchar(‘Здесь могла быть ваша реклама…’)));
Как вы заметили в последнем параметре функции, передаем сообщение полю. Для этого воспользуемся флагом — WM_SETTEXT.

Со своей формой работать не проблема, а вот с чужими посложней будет. Теперь я покажу как в блокноте написать незамысловатый текст.

Пример:

procedure TForm1.Timer1Timer(Sender: TObject);
var
wnd,Edit: HWND;
begin
wnd:=WindowFromPoint(Mouse.CursorPos);
//или попробуйте вот так:
//wnd:=FindWindowEx(FindWindow(nil, ‘Безымянный — Блокнот’), 0,nil,»);
//ищем пустое поле в окне блокнота
//и передаем сообщение
SendMessage(wnd,WM_SETTEXT, 0, Integer(pchar(‘.:LIVEOFPC — Жизнь компа:.’)));
end;
Разберем пример. Здесь я использовал таймер, интервал которого поставил на 5000 (для того чтобы выбрать блокнот и нажать на текстовое поле. Зачем? Читай дальше…) Далее в переменную «wnd» записываем ИДЕНТИФИКАТОР КОМПОНЕНТА НАД КОТОРЫМ НАХОДИТЬСЯ КУРСОР. Ну а следующим действием будет отсылка сообщения приложению.

Понравилась статья? Поделиться с друзьями: