Enganchar el ratón para capturar eventos fuera de una aplicación

Aprende a rastrear la actividad del ratón incluso cuando la aplicación Delphi no está activa, está en la bandeja o no tiene ninguna interfaz de usuario.

Instalando un gancho para ratón a nivel de todo el sistema (o global) se puede controlar lo que el usuario está haciendo con el ratón y actuar en consecuencia.

¿Qué es un gancho y cómo funciona?

En resumen, un gancho es una función (de devolución de llamada) que puedes crear como parte de una DLL (biblioteca de enlace dinámico) o de tu aplicación para monitorizar el «funcionamiento» dentro del sistema operativo Windows.
Hay 2 tipos de ganchos – global y local. Un gancho local monitoriza las cosas que suceden sólo para un programa (o hilo) específico. Un gancho global monitoriza todo el sistema (todos los hilos).

Para crear un gancho global se necesitan 2 proyectos, 1 para hacer el archivo ejecutable y 1 para hacer una DLL que contenga el procedimiento del gancho.

Nuestro artículo sobre el trabajo con ganchos de teclado de Delphi explica cómo interceptar la entrada del teclado para los controles que no pueden recibir el foco de entrada (como TImage).

Enganchar el ratón

Por diseño, el movimiento del ratón está restringido por el tamaño de la pantalla del escritorio (incluyendo la barra de tareas de Windows). Cuando mueva el ratón hacia la izquierda/derecha/arriba/abajo, el ratón se «detendrá» – como se espera (si no tiene más de un monitor).

He aquí una idea para el gancho del ratón en todo el sistema: Si por ejemplo, quieres mover el ratón a la derecha de la pantalla cuando se mueve hacia el borde izquierdo (y lo «toca»), podrías escribir un gancho global del ratón para reposicionar el puntero del ratón.

Comienzas creando un proyecto de biblioteca de enlaces dinámicos. La DLL debería exportar dos métodos: «HookMouse» y «UnHookMouse».

El procedimiento HookMouse llama a la API SetWindowsHookEx pasando el «WH_MOUSE» para el primer parámetro – instalando así un procedimiento hook que monitoriza los mensajes de ratón. Uno de los parámetros del SetWindowsHookEx es la función de llamada que Windows llamará cuando haya un mensaje de ratón que procesar:

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

El último parámetro (valor = 0) en el SetWindowsHookEx define que estamos registrando un gancho global.

El HookProc analiza los mensajes relacionados con el ratón y envía un mensaje personalizado («MouseHookMessage») a nuestro proyecto de prueba:

function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResultado; stdcall;
var
mousePoint: TPoint;
notifyTestForm : boolean;
MouseDirection: TMouseDirection;
comienza
mousePoint := PMouseHookStruct(Data)^.pt;
notifyTestForm := false;
si (mousePoint.X = 0) entonces
comienza
Windows.SetCursorPos(-2 + Pantalla.Ancho, mousePoint.y) ;
notifyTestForm := true;
MouseDirection := mdRight;
fin;

….

si notifyTestForm entonces
comienza
PostMessage(FindWindow('TMainHookTestForm', nil), MouseHookMessage, MsgID, Integer(MouseDirection)) ;
fin;

Resultado := CallNextHookEx(Gancho,nCódigo,MsgID,Datos) ;

final;

punta: Lee los archivos de ayuda del SDK de Win32 para conocer el registro PMouseHookStruct y la firma de la función HookProc.

Nota: Una función de gancho no necesita enviar nada a ninguna parte – la llamada PostMessage se utiliza sólo para indicar que la DLL puede comunicarse con el mundo «exterior».

Gancho del ratón «Escuchador»

El mensaje «MouseHookMessage» es enviado a su proyecto de prueba – un formulario llamado «TMainHookTestForm». Usted anulará el método WndProc para obtener el mensaje y actuar según sea necesario:

procedimiento TMainHookTestForm.WndProc(var Mensaje: TMessage) ;
comienza
heredó WndProc(Mensaje) ;
si Message.Msg = HookCommon.MouseHookMessage entonces
comienza
//implementación que se encuentra en el código adjunto
Señal(TMouseDirection(Message.LParam)) ;
fin;
fin;

Por supuesto, cuando se crea el formulario (OnCreate) llamas al procedimiento HookMouse desde la DLL, cuando se cierra (OnDestroy) llamas al procedimiento UnHookMouse.

Nota: Los ganchos tienden a ralentizar el sistema porque aumentan la cantidad de procesamiento que el sistema debe realizar para cada mensaje. Debe instalar un gancho sólo cuando sea necesario, y quitarlo lo antes posible.

Leave a Reply