Хук Мышь, чтобы поймать события за пределами приложения

Узнайте, как отслеживать активность мыши, даже если ваше приложение Delphi не активно, находится в лоток или делает не имеет интерфейса совсем.

Установив общесистемный (или глобальный) хук мыши, вы можете отслеживать, что пользователь делает с мышь и действовать соответственно.

Что такое крюк и как он работает?

Короче, крюк это (Перезвони) функцию, которую вы можете создать как часть DLL (библиотека динамических ссылок) или ваше приложение для отслеживания «продолжений» в операционной системе Windows.
Есть 2 типа хуков - глобальные и локальные. Локальный хук отслеживает события, происходящие только для определенной программы (или потока). Глобальный хук контролирует всю систему (все потоки).

Чтобы создать глобальный хук, вам нужно 2 проекта, 1 для создания исполняемого файла и 1 для создания DLL, содержащей процедуру хука.

Наша статья о работа с зацепками клавиатуры от Delphi объясняет, как перехватить ввод с клавиатуры для элементов управления, которые не могут получить фокус ввода (например, TImage).

instagram viewer

Подключать мышь

По своей природе движение мыши ограничено размером экрана рабочего стола (включая панель задач Windows). Когда вы перемещаете мышь к левому / правому / верхнему / нижнему краю, мышь «остановится» - как и ожидалось (если у вас нет более одного монитора).

Вот идея общесистемного подключения мыши: если, например, вы хотите переместить мышь в правую часть экрана когда он движется к левому краю (и «касается» его), вы можете написать глобальный хук мыши, чтобы переместить мышь указатель.

Вы начинаете с создания проекта библиотеки динамических ссылок. DLL должна экспортировать два метода: «HookMouse» и «UnHookMouse».

Процедура HookMouse вызывает SetWindowsHookEx API передает «WH_MOUSE» для первого параметра - таким образом, устанавливается процедура подключения, которая отслеживает сообщения мыши. Одним из параметров SetWindowsHookEx является функция обратного вызова, которую Windows будет вызывать при обработке сообщения мыши:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

Последний параметр (значение = 0) в SetWindowsHookEx определяет, что мы регистрируем глобальный хук.

HookProc анализирует связанные с мышью сообщения и отправляет пользовательское сообщение ("MouseHookMessage") в наш тестовый проект:

функция HookProc (nCode: Integer; MsgID: WParam; Данные: LParam): LResult; STDCALL;

вар

 mousePoint: TPoint;

 notifyTestForm: логическое значение;

 MouseDirection: TMouseDirection;

начать

 mousePoint: = PMouseHookStruct (Data) ^. pt;


 notifyTestForm: = false;


если (MousePoint. Х = 0) тогда

начать

 Окна. SetCursorPos (-2 + Экран. Ширина, mousePoint.y);

 notifyTestForm: = true;

 MouseDirection: = mdRight;

конец;

...
если notifyTestForm тогда

начать

 PostMessage (FindWindow ('TMainHookTestForm', nil), MouseHookMessage, MsgID, Integer (MouseDirection));

конец;

Результат: = CallNextHookEx (Hook, nCode, MsgID, Data);
конец;

ЧаевыеПрочтите файлы справки Win32 SDK, чтобы узнать о записи PMouseHookStruct и подписи функции HookProc.

Заметка: Функции ловушки не нужно ничего отправлять куда-либо - вызов PostMessage используется только для указания того, что DLL может взаимодействовать с «внешним» миром.

Мышь Крючок "Слушатель"

Сообщение «MouseHookMessage» отправляется в ваш тестовый проект - форма с именем «TMainHookTestForm». Вы переопределите метод WndProc, чтобы получить сообщение и действовать по мере необходимости:

процедура TMainHookTestForm. WndProc (вар Сообщение: TMessage);

начать

унаследованный WndProc (Сообщение);

если Сообщение. Msg = HookCommon. MouseHookMessage тогда

начать

// реализация найдена в сопроводительном коде

 Сигнал (TMouseDirection (Сообщение. Л.Парам));

конец;

конец;

Конечно, когда форма создается (OnCreate), вы вызываете процедуру HookMouse из DLL, когда она закрывается (OnDestroy), вы вызываете процедуру UnHookMouse.

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

instagram story viewer