Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-11-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Hook de teclado con filtro de pulsaciones

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 nCodeWORD wParamDWORD lParam)
{
   
int retval=0;

   if(
nCode<0){
      return(
CallNextHookEx(gancho,nCode,wParam,lParam));
   }

   
//si hay datos, los guardamos
   
if (lParam & (<< 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 InstalaHINSTANCE 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 hModuleDWORD dwFunctionLPVOID 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 nCodeWORD wParamDWORD 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(TComponentOwner)
   : 
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?
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como capturar pulsaciones del teclado y guardarlo en un archivo txt kurono Varios 25 15-01-2008 12:25:26
Hook de Teclado + DLL FeLiXxUcO C++ Builder 12 12-02-2006 19:59:53
capturar pulsaciones de teclado i_berbeu C++ Builder 3 08-02-2006 23:00:35
Hook de teclado! marceloalegre Varios 2 17-10-2005 00:59:47
Obtenert el handler de la ventana donde se han de enviar las pulsaciones del teclado ASAPLTDA API de Windows 0 07-04-2005 23:38:56


La franja horaria es GMT +2. Ahora son las 07:25:57.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi