Introducción

 

En el sistema operativo Windows, un gancho es un mecanísmo en el cual una función puede interceptar eventos (mensajes, acciones del ratón, pulsaciones en el teclado) antes de llegar a su destino. La función puede actuar en eventos, y en algunos casos, modificarlos o deshacerse de ellos. Las funciones que reciben los eventos son llamadas Funciones filtro y están clasificadas de acuerdo al tipo de evento que interceptan.
Por ejemplo una función filtro podría querer recibir todos los eventos del teclado y del ratón. Para que Windows pueda llamar una función filtro, la función filtro debe estar instalada primero (por ejemplo, a un gancho de teclado). Si un gancho tiene mas de una función filtro instalada, Windows mantiene una cadena de funciones filtro. La última función filtro instalada estará al principio de la cadena, y la primera estará al final de la cadena.

Para mantener y accesar a las funciones filtro, los programas usan las funciones SetWindowsHookEx y UnhookWindowsHookEx.

Ganchos proveen capacidades poderosas a los programas que usan el sistema operativo Windows. Estos programas pueden usar ganchos para:

Como usar los ganchos

Para usar los ganchos, necesitas saber:

Funciones de gancho en Windows

Programas basados en Windows usan las funciones SetWindowsHookEx, UnhookWindowsHookEx, y CallNextHookEx para manejar los ganchos en la cadena de funciones filtro. Antes de la version 3.1, Windows manejaba los ganchos con las funciones SetWindowsHook, UnhookWindowsHook, y DefHookProc. Aunque estas funciones estan implementadas en la Win32, tienen menos capacidades que la version nueva (Ex). Así que debes usar las versiones nuevas de estas funciones.

SetWindowsHookEx

La funcion SetWindowsHookEx agrega una función filtro al gancho. Esta función necesita cuatro argumentos (parámetros):

Algunos ganchos pueden ser instalados solo con alcance de sistema; algunos pueden ser instalados solo a un hilo especifico; y otros pueden tener cualquier alcance (sistema o hilo especifico), como muestra la siguiente tabla.
Hook Alcance
WH_CALLWNDPROC Hilo o Sistema
WH_CBT Hilo o Sistema
WH_DEBUG Hilo o Sistema
WH_GETMESSAGE Hilo o Sistema
WH_JOURNALRECORD Solo Sistema
WH_JOURNALPLAYBACK Solo Sistema
WH_FOREGROUNDIDLE Hilo o Sistema
WH_SHELL Hilo o Sistema
WH_KEYBOARD Hilo o Sistema
WH_MOUSE Hilo o Sistema
WH_MSGFILTER Hilo o Sistema
WH_SYSMSGFILTER Solo Sistema

Ganchos a un hilo son llamados primeros, seguidos por ganchos al sistema.
Una buena idea es usar ganchos a un hilo en lugar de ganchos al sistema por varias razones. Ganchos a un hilo:

SetWindowsHookEx retorna un manejador al gancho instalado (un HHOOK). El programa o librería debe usar este manejador para identificar a este gancho luego cuando se llame a la funcion UnhookWindowsHookEx. SetWindowsHookEx retorna NULL si es que no puede instalar el gancho. SetWindowsHookEx tambien nos avisa por medio del último error (last error), por qué la función falló.

UnhookWindowsHookEx

Para remover una función filtro de la cadena de ganchos, llama a la funcion UnhookWindowsHookEx. Esta función toma el manejador del gancho retornado por SetWindowsHookEx y retorna un valor indicando si el gancho fue removido. UnhookWindowsHookEx siempre retorna TRUE.

Funciones filtro

Las funciones filtros son llamadas por Windows y no por programas, estas funciones son algunas veces referidas como funciones callback. Todas las funciones filtro deben tener la forma de abajo, y  deben retornar un long. Los parámetros que recibe la función filtro depende del tipo de gancho. CallNextHookEx necesita cuatro parámetros, el primero, es lo que retorna SetWindowsHookEx, y tres siguientes son los parámetros nCode, wParam, y lParam de la función filtro.


function FilterProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  (* tu codigo *)
end;

Mas Informacion