Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-11-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Registrando HotKeys:

Código PHP:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <vcl\Clipbrd.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
RegisterHotKey(Handle, 67, MOD_CONTROL, 67);
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Procesamos los mensajes a bajo nivel
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
  if(
Message.Msg == WM_HOTKEY)
    if(
Message.WParam == 67) Clipboard()->Clear();  

  
TForm::WndProc(Message);
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   
UnregisterHotKey(Handle, 67);     
}
//--------------------------------------------------------------------------- 
Saludos.
Responder Con Cita
  #2  
Antiguo 25-11-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Amigo el hook va fantastico, lo he modificado un poquitin y quedó así:

App:
Código PHP:
#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

typedef void (*LPFuncion)(BOOL,HINSTANCE/*Redefiní la funcion*/);

TForm1 *Form1;
HMODULE Dll;
bool errorFunc=true, errorDll=true;
LPFuncion Funcion=NULL;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonColocarHookClick(TObject *Sender)
{
   
ColocarHook();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonQuitarHookClick(TObject *Sender)
{
   
//desinstalamos el hook
   
Funcion(FALSE,NULL);

   
ButtonColocarHook->Enabled = true;
   
ButtonQuitarHook->Enabled = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
   
ColocarHook();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   
//desinstalamos el hook
   
if(!errorFunc)
      
Funcion(FALSE,NULL);

   
//liberamos la memoria
   
if(!errorDll)
      
FreeLibrary(Dll);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ColocarHook()
{
   
//cargamos la Dll
   
Dll=LoadLibrary("DllHookKeyboard.dll");
   if(!
Dll){
      
ShowMessage("No se encontró la Dll: DllHookKeyboard.dll");
      
errorDll = true;
   }else{
      
errorDll = false;
      
//buscamos la funcion en la dll
      
Funcion = (LPFuncion)GetProcAddress(Dll, "CreaHook");
      if(!
Funcion){
         
ShowMessage("ERROR, no se encontró la función: Crck");
         
errorFunc = true;
      }else{
         
//ejecutamos la función
         
Funcion(TRUE,Dll);//instalamos el hook
         
ButtonColocarHook->Enabled = false;
         
ButtonQuitarHook->Enabled = true;
         
errorFunc = false;
      }
   }
} 
Dll:
Código PHP:
#include <windows.h>

#define OK -32767 //Necesario para el keylogger

HHOOK gancho;

#pragma argsused  

LRESULT CALLBACK Filtro(int nCode, WORD wParam, DWORD lParam)
{
   if(
nCode == HC_ACTION){
     if((
GetKeyState(0x43) < 0) && GetAsyncKeyState(VK_CONTROL) == OK){ //si pulsamos [Ctl+C]
       
CloseClipboard();
       
OpenClipboard(0);
       
EmptyClipboard();
       
MessageBox(NULL,"Has intentado copiar al portapapeles con Ctrl+C","Atención", MB_OK | MB_ICONINFORMATION);
     }
     else if((
GetKeyState(0x56) < 0) && GetAsyncKeyState(VK_CONTROL) == OK){ //si pulsamos [Ctl+V]
       
CloseClipboard();
       
MessageBox(NULL,"Has intentado pegar desde el portapapeles con Ctrl+V","Atención",MB_OK | MB_ICONINFORMATION);
     }
   }
   return 
CallNextHookEx(gancho,nCode,wParam,lParam);
}

/*******************************************************/
/*FUNCIÓN PARA INSTALAR/DESINSTALAR EL HOOK DEL TECLADO*/
/*******************************************************/
extern "C" __declspec(dllexport) __stdcall 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{
      
CloseClipboard();
      
retval = UnhookWindowsHookEx(gancho);
   }
   return 
retval;
}
//---------------------------------------------------------------------------

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   return 
1;
} 
Ahora bien, lo que pones de los HotKeys a mi no me ha funcionado pero si me funciona usando esto:
http://docs.embarcadero.com/products...OnMessage.html

Por lo que puedo entender en el comentario del final del codigo dice que si no lo pongo yo handled a true será gestionado por otros manejadores y no veo que el haga nada al respecto si no lo maneja el y así lo dejé yo:

App.h:
Código PHP:
private:    // User declarations
   
TMessageEvent OldApplicationOnMessage;
   
void __fastcall AppMessage(tagMSG &Msg, bool &Handled); 
App.cpp:
Código PHP:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   
OldApplicationOnMessage = Application->OnMessage;
   
Application->OnMessage = AppMessage;
   
RegistrarHotKeys();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   
Application->OnMessage = OldApplicationOnMessage;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
   if(
Msg.message == WM_HOTKEY)
   {
      
//Comprobamos si se pulsó algún atajo de teclado

      
if( LOWORD(Msg.lParam) == MOD_CONTROL )
      {
         switch( 
HIWORD(Msg.lParam) )
         {
            case 
'L':
               
ButtonClic->Click();
               
Sleep(150);
               
Handled = true;
               break;

            case 
'C':
               
ButtonClose->Click();
               
Handled = true;
               break;

            case 
'D':
               
ButtonDisable->Click();
               
Handled = true;
               break;

            case 
'A':
               
ButtonEnable->Click();
               
Handled = true;
               break;

            case 
'M':
               
ButtonShow->Click();
               
Handled = true;
               break;

            case 
'O':
               
ButtonHide->Click();
               
Handled = true;
               break;

            case 
'X':
               
ButtonMaximize->Click();
               
Handled = true;
               break;

            case 
'R':
               
ButtonRestore->Click();
               
Handled = true;
               break;

            case 
'I':
               
ButtonMinimize->Click();
               
Handled = true;
               break;

            case 
'S':
               
ButtonTopmost->Click();
               
Handled = true;
               break;

            case 
'N':
               
ButtonNonTop->Click();
               
Handled = true;
               break;

            case 
'E':
               
ButtonSendCaption->Click();
               
Handled = true;
               break;

            case 
'F':
               if(
ButtonIntroHandle->Enabled == true)
                  
ButtonIntroHandle->Click();
               
Handled = true;
               break;
         }
      }
   }
} 
Así va perfecto pero no se si es lo mas correcto o no
Responder Con Cita
  #3  
Antiguo 25-11-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
La mejor forma de hacer un hook al teclado es el de bajo nivel, WH_KEYBOARD_LL sin dll. Es el primer hook que te mostré.

Las HotKeys funcionan tanto si los mensajes los tratas a nivel de formulario (a bajo nivel, con sobreescritura de la función WndProc, o capturando mensajes estilo delphi, como capturando los mensajes en TApplication (Application->OnMessage)

Los mensajes WM_HOTKEY reciben en wParam el id usado para registrar la tecla. con dicho id conoces la tecla regictrada. Yo uso como dato de ese id le VK_ de la tecla que registro, así no tengo pérdidas.
Lo siguiente registra Ctl-C:
Código PHP:
RegisterHotKey(Handle, 67, MOD_CONTROL, 67); 
Y tratamos de esta manera el mensaje, usando Application->OnMessage, que parece que te gusta más:
Código PHP:
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
  if(
Msg.message == WM_HOTKEY){
    if(
Msg.wParam == 67)
      
Beep();
    
// else if ......
  
}    
} 
Al terminar la APP siempre debes usar UnregisterHotKey para liberar las HotKeys.


Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 09:17:36.


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