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. ***********-----------****** |