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

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" записываем ИДЕНТИФИКАТОР КОМПОНЕНТА НАД КОТОРЫМ НАХОДИТЬСЯ КУРСОР. Ну а следующим действием будет отсылка сообщения приложению.

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: