Enganche el mouse para atrapar eventos fuera de una aplicación

Aprenda cómo rastrear la actividad del mouse incluso cuando su aplicación Delphi no está activa, se sienta en la bandeja o no tiene ninguna interfaz de usuario.

Al instalar un gancho para mouse en todo el sistema (o global) puede monitorear lo que el usuario está haciendo con el mouse y actuar en consecuencia.

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

En resumen, un enlace es una función (devolución de llamada) que puede crear como parte de una DLL (biblioteca de enlaces dinámicos) o su aplicación para monitorear los "sucesos" dentro del sistema operativo Windows.
Hay 2 tipos de ganchos: globales y locales. Un enlace local monitorea cosas que suceden solo para un programa específico (o hilo). Un enlace global monitorea todo el sistema (todos los hilos).

Para crear un enlace global, necesita 2 proyectos, 1 para crear el archivo ejecutable y 1 para crear una DLL que contenga el procedimiento de enlace.

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

Enganchando el ratón

Por diseño, el movimiento del mouse está restringido por el tamaño de la pantalla del escritorio (incluida la barra de tareas de Windows). Cuando mueve el mouse hacia el borde izquierdo / derecho / superior / inferior, el mouse se "detendrá", como se esperaba (si no tiene más de un monitor).

He aquí una idea para el gancho del mouse en todo el sistema: si, por ejemplo, desea mover el mouse hacia el lado derecho de la pantalla cuando se mueve hacia el borde izquierdo (y "lo toca"), puede escribir un gancho de mouse global para reposicionar el puntero del mouse.

Comienza creando un proyecto de biblioteca de enlaces dinámicos. La DLL debe exportar dos métodos: "HookMouse" y "UnHookMouse".

El procedimiento HookMouse llama al SetWindowsHookEx API pasando el "WH_MOUSE" para el primer parámetro, instalando así un procedimiento de enlace que monitorea los mensajes del mouse. Uno de los parámetros para SetWindowsHookEx es su función de devolución de llamada que Windows llamará cuando haya que procesar un mensaje del mouse:

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

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

El HookProc analiza los mensajes relacionados con el mouse y envía un mensaje personalizado ("MouseHookMessage") a nuestro proyecto de prueba:

 función HookProc (nCode: Integer; MsgID: WParam; Datos: LParam): LResult; stdcall;

var

    mousePoint: TPoint;

    notifyTestForm: boolean;

    MouseDirection: TMouseDirection;

 empezar

    mousePoint: = PMouseHookStruct (Datos) ^. pt;

 

    notifyTestForm: = false;

 

    Si (mousePoint.X = 0) luego

    empezar

      Windows.SetCursorPos (-2 + Screen.Width, mousePoint.y);

      notifyTestForm: = verdadero;

      MouseDirection: = mdRight;

    final;

...
  
Si notifyTestForm luego

    empezar

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

    final;

   Resultado: = CallNextHookEx (Hook, nCode, MsgID, Data);
final;

Propina: Lea los archivos de ayuda del SDK de Win32 para obtener información sobre el registro PMouseHookStruct y la firma de la función HookProc.

Nota: Una función de enlace no necesita enviar nada a ninguna parte; la llamada PostMessage se usa solo para indicar que la DLL puede comunicarse con el mundo "externo".

Gancho de ratón "Oyente"

El mensaje "MouseHookMessage" se publica en su proyecto de prueba, un formulario llamado "TMainHookTestForm". Anulará el método WndProc para obtener el mensaje y actuar según sea necesario:

 procedimiento TMainHookTestForm.WndProc (var Mensaje: TMessage);

empezar

    heredado WndProc (Mensaje);

  
Si Message.Msg = HookCommon.MouseHookMessage luego

    empezar

      // implementación encontrada en el código adjunto

      Señal (TMouseDirection (Message.LParam));

    final;

final;

Por supuesto, cuando se crea el formulario (OnCreate), llama al procedimiento HookMouse desde la DLL, cuando se cierra (OnDestroy) llama 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 solo cuando sea necesario y retirarlo lo antes posible.