![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте, суть задачи такова. Есть некоторое приложение, запущенное на компьютере. В окне у этого приложения есть какие-то кнопки. Возможно ли написать такую программу, которая организовывала бы нажатие на кнопку в этом стороннем приложении.
P.S. Литературу, посвященную работе с посторонними окнами читал, но то, что нужно не нашел. |
|
#2
|
|||
|
|||
|
Win32 API вам в руки.
Допустим, есть на чужом окне кнопка, подписанная как 'btn'. Вашему приложению необходимо найти дескриптор чужого окна (handle) и затем — дескриптор кнопки 'btn', которая тоже является (дочерним) окном по сути. Поиск окна по заголовку можно осуществлять с помощью функций FindWindow и FindWindowEx. Вот, например, такой код позволит вам нажать кнопку 'btn', расположенную в чужом окне с заголовком, скажем, 'other form'. Код:
procedure TForm1.Button1Click(Sender: TObject);
var
OtherWnd: HWND;
BtnWnd: HWND;
begin
OtherWnd := FindWindow(nil, PChar('other form'));
BtnWnd := FindWindowEx(OtherWnd, 0, nil, PChar('btn'));
SendMessage(BtnWnd, BM_CLICK, 0, 0);
end; |
|
#3
|
||||
|
||||
|
Можно. Только нужно знать абсолютные координаты кнопки.
Вот код: Код:
procedure mouseclick(pt: tpoint; backcursor: boolean = true);
// Переводим экранные координаты к принятым в mouse_event
function screentoabsolute(const pt: tpoint): tpoint;
begin
result.x := round(pt.x * 65535 / screen.width);
result.y := round(pt.y * 65535 / screen.height);
end;
var
oldpt: tpoint;
begin
if backcursor then
oldpt := screentoabsolute(mouse.cursorpos);
pt := screentoabsolute(pt);
{Переместим курсор мыши}
mouse_event(mouseeventf_absolute or mouseeventf_move, pt.x, pt.y, 0, 0);
{Нажамаем левую кнопку мыши}
mouse_event(mouseeventf_absolute or mouseeventf_leftdown, pt.x, pt.y, 0, 0);
{Отпускаем левую кнопки мыши}
mouse_event(mouseeventf_absolute or mouseeventf_leftup, pt.x, pt.y, 0, 0);
if backcursor then
{Перемещаем кнопку мыши обратно}
mouse_event(mouseeventf_absolute or mouseeventf_move, oldpt.x, oldpt.y, 0, 0);
end; |
|
#4
|
|||
|
|||
|
Спасибо за советы, буду пробовать.
|