В книге "Программирование Delphi глазами хакера" я описывал несколько способов подшутить над мышью и по письмам понял, что многих интересует, как можно кликнуть в произвольной области экрана. Почему-то это вызывает проблемы, хотя ничего сложного нет.

Давайте разберем, как можно нажать кнопку Пуск (листинг 3.11).

Листинг 3.11. Нажатие кнопки Пуск

procedure TForml.bStartClickerClick(Sender: TObject). var
pPoint: TPoint: hPointWnd: HWnd: begin
pPoint.X := 15:
pPoint.Y := Screen.Height-20:
SetCursorPos(pPoint.X, pPoint.Y);
hPointWnd := WindowFromPoint(pPoint):
SendMessage(hPointWnd. WM_LBUTT0ND0WN, MK_LBUTT0N. MAKELONGd. D);
SendMessageChPomtWnd. WM_LBUTT0NUP. 0. MAKELONGd. D);
end:

Для указания точки, в которой будет происходить щелчок, используем переменную pPoint типа TPoint. Этот тип очень удобен для хранения координат точки, потому что структура TPoi nt состоит из двух полей X и Y, имеющих целочисленный тип (Longint). Для координаты X укажем значение в 15 пикселов, а координату Y сделаем равной высоте экрана минус 20 пикселов. Где-то в этой области должна находится кнопка Пуск.

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

После задания координат переносим в указанную точку курсор с помощью функции SetCursorPos. Для наглядности поместим курсор в то место, где будем щелкать мышью. У функции SetCursorPos два параметра - координаты точки X и Y, в которую должен переместиться курсор.

Теперь определяем окно, расположенное для точки, в которой будем щелкать мышью. Для этого есть функция WindowFromPoint Ей нужно передать структуру типа Tpoi nt. В результате получается указатель на окно, которое расположено в этой точке.

Определив окно, в котором нужно произвести клик, посылаем ему сообщение о том, что левая кнопка мыши нажата и отпущена в заданной точке:

SendMessage(hPointWnd. WM_LBUTT0ND0WN. MK_LBUTTON. MAKELONGd. D):
SendMessage(hPointWnd. WM_LBUTTONUP. 0. MAKELONGd. 1));

В первой строке окну hPointWnd (в котором нужно щелкнуть мышью) посылается сообщение WM_LBUTT0ND0WN (левая кнопка мыши нажата). Позиция, в которой произошел щелчок, указывается в качестве последнего параметра в виде длинного числа. Чтобы передать в этом параметре координаты (170, 204) можно воспользоваться макросом MAKELONGU70, 204). Обращаю ваше внимание, что это координаты относительно окна, которому посылаются сообщения (hPointWnd), а не всего экрана.

Во второй строке посылаем такое же сообщение, но во втором параметре передаем событие WMLBUTT0NUP (левая кнопка мыши отпущена). Таким образом, мы посылаем события нажатия и отпускания мыши или щелчка в указанной точке.

Чтобы превратить пример в "проказу", можно поместить код процедуры в бесконечный цикл (whi 1 е true do). Таким образом, будут происходить постоянные щелчки кнопки Пуск и работа за компьютером станет затруднительной. Так как мы передвигаем курсор мыши в точку, на которой будет происходить щелчок, то после любой попытки поменять положение курсора, код возвратит его обратно и движения курсором станут невозможными.

Если вы решили сделать бесконечный цикл, то между нажатиями или щелчками советую сделать задержку с помощью функции WaitForSingleObject (листинг 3.12).

Листинг 3.12. Бесконечное нажатие кнопки Пуск с перерывами в 1 секунду

var
pPoint: TPoint;
hPointWnd: HWnd: h: THandle: begin
pPoint.X := 15:
pPoint.Y := Screen Height-20:

// Создаем пустое событие для реализации задержки h := CreateEvent(ml. true, false, nil):

while true do begin продолжение &
Листинг 3.12 (продолжение)
II Устанавливаем курсор SetCursorPos(pPoint.X. pPoint.Y);

// Отправляем окно

hPointWnd :- WindowFromPoint(pPoint);
// Отправляем сообщения о нажатии и отпускании кнопки SendMessage(hPointWnd. WM_LBUTT0ND0WN, MK_LBUTTON, MAKELONGd, D): SendMessage(hPointWnd. WM_LBUTTONUP. 0, MAKELONG(0, 0));

// Задержка в 1 секунду WaitForSingleObjecKh. 1000):

end:
end:

Давайте видоизменим пример. Теперь будет происходить беспорядочное нажатие в любом месте экрана (листинг 3.13).

Листинг 3.13. Беспорядочное нажатие в любой области экрана

procedure TForml.ЬСТickerCIick(Sender: TObject): var i: Integer; pPoint: TPoint; hPointWnd: HWnd; h: THandle: begin // Создаем пустое событие для реализации задержки h := CreateEvenKnil, true, false, nil):

for i :- 0 to 20 do begin
// Перемещаем курсор мыши в случайное место pPoint.X := random(Screen.Width);
pPoint.Y := random(Screen.Height): SetCursorPos(pPoint.X, pPoint.Y);

// Задержка в 1 секунду WaitForSingleObject(h, 1000):

// Определяем окно

hPointWnd := WindowFromPoint(pPoint):

// Посылаем ему сообщение о нажатой кнопке

SendMessage(hPointWnd. WM_LBUTT0ND0WN. MK_LBUTTON. MAKELONG(0. 0)).

// Посылаем ему сообщение об отпущенной кнопке SendMessage(hPointWnd, WMJJUTTONUP, 0, MAKELONG(0. 0)):

end;
end;

Этот пример отличается от листинга 3.12 только тем, что позиции для щелчка выбираются случайным образом.

Но и это еще не все. Ведь можно нажать кнопку в одном месте, а отпустить в другом. В этом случае возникнет эффект выделения или перетаскивания, все зависит от того, в какое место попадет курсор мыши. Если в момент выполнения программы на экране будет находиться текстовый редактор то текст будет беспорядочно выделяться, а если чистый Рабочий стол, то появится вероятность перемешивания значков. Реализация вышесказанного приведена в листинге 3.14.

Листинг 3.14. Беспорядочное перетаскивание

procedure TForml.bDraggerClick(Sender: TObject): var i: Integer; pPoint: TPoint: hPointWnd: HWnd; begin for i := 0 to 20 do begin // Перемещаем курсор мыши в случайное место pPoint.X := random(Screen.Width): pPoint.Y := random(Screen.Height): SetCursorPos(pPoint.X. pPoint.Y).

Sleep(lOO):

// Определяем окно

hPointWnd :" WindowFromPoint(pPoint):

// Посылаем ему сообщение о нажатой кнопке

SendMessage(hPointWnd. WM_LBUTT0ND0WN. MK_LBUTTON. MAKELONG(0. 0)):
// Перемещаем курсор мыши в случайное место pPoint.X := random(Screen Width), pPoint.Y := random(Screen.Height): SetCursorPos(pPoint.X. pPoint.Y);

Sleep(lOO), // Определяем окно

hPointWnd := WindowFromPoint(pPoint), // Посылаем ему сообщение об отпущенной кнопке

SendMessage(hPointWnd. WM_LBUTTONUP, 0, MAKELONGC0. 0)):
end:
end:

ПРИМЕЧАНИЕ -'-

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге Sources\ch03\Mouse.

3.10. Панель задач || Оглавление || 3.12. Блокировка окон


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31