Hola amigos, me gustaria crear un hook el cual me permita capturar las pulsaciones de teclado y poder anular pulsaciones como el Ctrl+C y otras que interfieran con el buen funcionamiento de mi aplicacion. Tengo este codigo:
dll.cpp:
Código PHP:
#include <windows.h>
#include "dll.h"
#pragma data_seg("SharedBlock")
#pragma data_seg()
#define OK -32767 //Necesario para el keylogger
enum {LCtrl,RCtrl,HacerClic,Cerrar,Activar,Desactivar,Mostrar,Ocultar,Maximizar,Restaurar,Minimizar,SiempreEncima,NoEncima,Enviar};
HHOOK gancho;
/**********************************************/
/*FUNCION PARA FILTRAR LOS RESULTADOS DEL HOOK*/
/**********************************************/
LRESULT CALLBACK Filtro(int nCode, WORD wParam, DWORD lParam)
{
int retval=0;
if(nCode<0){
return(CallNextHookEx(gancho,nCode,wParam,lParam));
}
//si hay datos, los guardamos
if (lParam & (1 << 31)) {
BYTE KeyboardState[256];
GetKeyboardState(KeyboardState);
WORD CharValue;
//Aqui el codigo de filtrado de pulsaciones
if(GetAsyncKeyState(VK_LCONTROL)==OK){ //si está pulsada [Ctrl(Izq)]
retval = LCtrl;
}else if(GetAsyncKeyState(VK_RCONTROL)==OK){ //si está pulsada [Ctrl(Dcha)]
retval = RCtrl;
}else if((GetKeyState(76) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+L]
retval = HacerClic;
}else if((GetKeyState(67) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+C]
retval = Cerrar;
}else if((GetKeyState(65) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+A]
retval = Activar;
}else if((GetKeyState(68) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+D]
retval = Desactivar;
}else if((GetKeyState(77) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+M]
retval = Mostrar;
}else if((GetKeyState(79) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+O]
retval = Ocultar;
}else if((GetKeyState(88) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+X]
retval = Maximizar;
}else if((GetKeyState(82) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+R]
retval = Restaurar;
}else if((GetKeyState(73) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+I]
retval = Minimizar;
}else if((GetKeyState(83) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+S]
retval = SiempreEncima;
}else if((GetKeyState(78) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+N]
retval = NoEncima;
}else if((GetKeyState(69) < 0) && ((GetKeyState(VK_LCONTROL) < 0) || (GetKeyState(VK_RCONTROL) < 0))){ //si pulsamos [Alt+E]
retval = Enviar;
}
}
return CallNextHookEx(gancho,nCode,wParam,lParam);
}
/*******************************************************/
/*FUNCIÓN PARA INSTALAR/DESINSTALAR EL HOOK DEL TECLADO*/
/*******************************************************/
extern "C" __declspec(dllexport)int CreaHook(BOOL Instala, HINSTANCE DLLInst)
{
int retval;
if(Instala==TRUE) {
gancho=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)Filtro,DLLInst,0);
if(gancho==NULL){
retval = 0;
}else{
retval = 1;
}
}else{
retval = UnhookWindowsHookEx(gancho);
}
return retval;
}
/*************************/
/*PROCEDIMIENTO PRINCIPAL*/
/*************************/
BOOL WINAPI DllMain(HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
{
return TRUE;
}
dll.h:
Código PHP:
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT extern "C" __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT extern "C" __declspec (dllimport)
#endif /* Not BUILDING_DLL */
LRESULT CALLBACK Filtro(int nCode, WORD wParam, DWORD lParam);
extern "C" __declspec(dllexport)int CreaHook(BOOL Instala,HINSTANCE DLLInst);
#endif /* _DLL_H_ */
Unit1.cpp:
Código PHP:
#include <vcl.h>
#pragma hdrstop
#include <windows.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HMODULE Dll;
typedef void (*LPFuncion)(BOOL,HINSTANCE/*Redefiní la funcion*/);
LPFuncion Funcion=NULL;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//cargamos la Dll
Dll=LoadLibrary("HookKeyboard.dll");
if(!Dll){
ShowMessage("No se encontró la Dll: RBT_KLogger.dll");
return;
}
//buscamos la funcion en la dll
Funcion = (LPFuncion)GetProcAddress(Dll, "_CreaHook");
if(!Funcion){
ShowMessage("ERROR");
FreeLibrary(Dll);
return;
}
//ejecutamos la función
Funcion(TRUE,Dll);//instalamos el hook
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//desinstalamos el hook
Funcion(FALSE,NULL);
//liberamos la memoria
FreeLibrary(Dll);
}
//---------------------------------------------------------------------------
De momento no se como aplicar el filtro. El hook funciona pero no se que hacer para filtrar esas pulsaciones.
Otra cosa, ¿por que me exporta CreaHook como _CreaHook?¿No se supone que el extern "C" evita eso?