THOok clase de Delphi con código fuente

Código presentado por Jens Borrisholt. Texto de Zarko Gajic.

Por Jens: Enganches, he visto a muchas personas tratando de hacer una solución limpia para enganchar mensajes en una aplicación. Así que hace algún tiempo decidí implementar ganchos como clase, con buenos eventos y cosas :)

Hook.pas hace posible asignar un puntero de método a un puntero de procedimiento (con ayuda del ensamblador).

Por ejemplo: si desea atrapar TODAS las pulsaciones de teclas en su aplicación, simplemente declare una instancia de TKeyboardHook, asigne un controlador de eventos para OnPreExecute o OnPostExecute, o ambos. Establezca KeyboadHook activo (KeyboardHook.Active: = True) y estará fuera de funcionamiento ...

En ganchos de Windows

Un enlace es un punto en el mecanismo de manejo de mensajes del sistema donde una aplicación puede instalar una subrutina para monitorear el tráfico de mensajes en el sistema y procesar ciertos tipos de mensajes antes de que lleguen al procedimiento de ventana de destino.

En pocas palabras, un gancho es una función que puede crear como parte de un dll o su aplicación para monitorear los "sucesos" dentro del sistema operativo Windows.

La idea es escribir una función que se llama cada vez que ocurre un determinado evento en Windows, por ejemplo, cuando un usuario presiona una tecla en el teclado o mueve el mouse.

Para una introducción más profunda a los ganchos, eche un vistazo a Qué son los ganchos de Windows y cómo usarlos dentro de una aplicación Delphi.

El mecanismo de enganche se basa en mensajes de Windows y funciones de devolución de llamada.

Tipos de ganchos

Por ejemplo:
Puede usar el gancho WH_KEYBOARD para monitorear la entrada del teclado publicada en una cola de mensajes;
Puede usar el enlace WH_MOUSE para monitorear la entrada del mouse publicada en una cola de mensajes;
Puede realizar un procedimiento de enlace WH_SHELL cuando la aplicación de shell está a punto de activarse y cuando se crea o destruye una ventana de nivel superior.

Hooks.pas

  • TCBTHook: llamado antes de activar, crear, destruir, minimizar, maximizar, mover o dimensionar una ventana; antes de completar un comando del sistema; antes de eliminar un evento de mouse o teclado de la cola de mensajes del sistema; antes de configurar el foco de entrada; o antes de sincronizar con la cola de mensajes del sistema.
  • TDebugHook: llamado antes de llamar a los procedimientos de enlace asociados con cualquier otro enlace en el sistema
  • TGetMessageHook: permite que una aplicación supervise los mensajes que va a devolver la función GetMessage o PeekMessage
  • TJournalPlaybackHook: permite que una aplicación inserte mensajes en la cola de mensajes del sistema.
  • TJournalRecordHook: le permite monitorear y grabar eventos de entrada (para grabar una secuencia de eventos de mouse y teclado para reproducirlos más tarde utilizando el gancho WH_JOURNALPLAYBACK).
  • TKeyboardHook: permite que una aplicación monitoree el tráfico de mensajes para los mensajes WM_KEYDOWN y WM_KEYUP.
  • TMouseHook: le permite monitorear los mensajes del mouse a punto de ser devueltos por la función GetMessage o PeekMessage.
  • TLowLevelKeyboardHook: le permite supervisar los eventos de entrada del teclado que se publicarán en una cola de entrada de subprocesos.
  • TLowLevelMouseHook: le permite controlar los eventos de entrada del mouse que se publicarán en una cola de entrada de subprocesos.

Ejemplo de TKeyboardHook

Descargue la aplicación de demostración hooks.pas +

 usa ganchos, ...
var
  KeyboardHook: TKeyboardHook;
...
// Procedimiento del controlador de eventos OnCreate de MainForm TMainForm.FormCreate (Remitente: TObject);
empezar
  KeyboardHook: = TKeyboardHook.Create;
  KeyboardHook.OnPreExecute: = KeyboardHookPREExecute;
  KeyboardHook.Active: = True;
final;
// maneja el procedimiento OnPREExecute de KeyboardHook TMainForm.KeyboardHookPREExecute (Hook: THook; var Hookmsg: THookMsg);
var
  Clave: Palabra;
empezar
  // Aquí puede elegir si desea devolver // el golpe de tecla a la aplicación o no
  Hookmsg.Result: = IfThen (cbEatKeyStrokes.Checked, 1, 0);
  Clave: = Hookmsg.WPARAM;
  Título: = Char (clave);
final;

Listo, listo, gancho :)