La Web del Programador: Comunidad de Programadores
 
    Pregunta:  4938 - FUNCIONES GANCHO (HOOK)
Autor:  JUAN TAGUA GOMEZ
Desde hace unos días estoy tratando de monitorizar (interceptar mensajes) de las distintas aplicaciones activas en un sistema (todos los procesos activos) con el núcleo de Windows y viceversa. Se trata de un ejemplo que deseo explicar en mi clase de Delphi a la vuelta de la Navidad.
Este tipo de cuestiones se resuelven con las funciones gancho (Hook), las cuales procesan el gancho en términos del proceso que las llama o en términos de sistema. El primer caso no presenta ningún problema y en el segundo tengo dificultades.
Concretamente, deseo que suene el altavoz MESSAGEBEEP(MB_ICONINFORMATION) del equipo desde cualquier aplicación si en ella se pulsa F7 y que después continúe el proceso interceptado.
Esto se hace mediante:
1) Un proyecto principal que incorpore la función SetWindowsHookEx(WH_KEYBOARD, @GanchoTeclado, hMod, 0), en el que el primer parámetro indica el tipo de gancho (teclado en este caso), el segundo la función que manejará el mensaje de teclado interceptado, el tercero el manejador del módulo de librería dll donde se encuentra la función y el último indica que se trata de un gancho de sistema.
2) Un proyecto librería que incorpore la función GanchoTeclado.

Mi solución no funciona!. ¿Podría ayudarme a localizar documentación, cualquiera que sea para resolver el problema?.Gracias.

  Respuesta:  Claudio Romero
Hola , aca esta este pequeño ejemplo, que intercepta el hook del teclado a nivel windows, consta de un exe y una libreria. Muestra un MessageBox cada vez que presiona F7 en cualquier aplicación.
Estan compilados con Delphi 2, pero deberia andar en cualquier delphi de 32 bits.
Si quieres te envio los compilados.

********------- El Exe beep_f7.dpr ------********
program beep_f7;
//Falta agregar el control de errores
//Claudio Romero ->[email protected]
//Compilado en Delphi 2
uses Windows;
var handle:integer;direccion:pointer;lpMsg: TMsg;
begin
handle:=loadlibrary('beep_dll.dll');
direccion:=getprocaddress(handle,'mensaje');
SetWindowsHookEx(WH_KEYBOARD,direccion,handle,0);
repeat
PeekMessage(lpMsg,0,0,0,1);
sleep(-1);
until 2=4
end.
***********--------------------***********

***********------La dll beep_dll.dpr -------******
library beep_dll;
////Falta agregar el control de errores
//Claudio Romero ->[email protected]
//Compilado en Delphi 2
uses windows;

function mensaje(code:integer;wparam:word;lparam:dword):dword;stdcall;
var EsKey_Up:dword;
begin
asm
mov eax, lparam
and eax, $c0000000
mov EsKey_Up, eax
end;
if (EsKey_Up<>$c0000000) THEN
if ((code=HC_ACTION)and(wparam=VK_F7)) then
begin
MessageBeep(MB_ICONEXCLAMATION);
MessageBox(0,'Aca iría el Beep, en mi PC no anda el speaker','',0);
end;
mensaje:=0;
end;

exports mensaje;
begin
end.
***********-----------******