Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Hook (detectar tecla presionada)

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Hook (detectar tecla presionada) Responder citando

Hola buena gente, estoy tratando de hacer un software que detecte todas las teclas que se presionan cuando la aplicacion este minimizada. Si hay algun codigo fuente simple peguenlo aqui.

He encontrado este codigo pero solo detecta la tecla "ENTER", el tema es que si puedo capturar cualquier tecla y mostrarla pero desde el DLL. Y quiero que cada tecla lo muestre el Label1 del programa principal.

Codigo fuente:
https://cppbuilder.es/viewtopic.php?t=9761

Por ejemplo esta es la parte del dll es la que toma la tecla ENTER

Código:
LRESULT CALLBACK KeybdProc(int nCode,WPARAM wParam,LPARAM lParam)
{
     // On envoie un message WMAP_KEYBDHOOKMSG à chaque fois que
    // l'utilisateur presse la touche ENTREE
     if (wParam == VK_RETURN)
          PostMessage(VueDonnees->hDestWindow, WMAP_KEYBDHOOKMSG, 0, 0);

     return CallNextHookEx(VueDonnees->KeybdHookHandle,nCode,wParam,lParam);
}


Si lo modifico como esta a continuacion muestra la tecla presionada pero no se como hacer para pasar la variable al Label1 del software principal.

Código:
LRESULT CALLBACK KeybdProc(int nCode,WPARAM wParam,LPARAM lParam)
{
     char tecla=char(wParam);
     ShowMessage(tecla);
     PostMessage(VueDonnees->hDestWindow, WMAP_KEYBDHOOKMSG, 0, 0);

     return CallNextHookEx(VueDonnees->KeybdHookHandle,nCode,wParam,lParam);
}


Desde ya muchas gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: SOLUCIONADO!!! Responder citando

Bueno despues de tanto buscar, comparto con ustedes la solucion de la manera mas simple... esto funciona con todas las teclas que presionas. Es un codigo que vi por ahi, pero lo modifique para que funcione con cualquier tecla y sea mucho mas claro para novatos.

Primero hay que crear una aplicacion e insertar dos Edit, uno para ver que letra se presiono y el segundo para ver su valor ASCII , luego modificar el "Unit1.h"

Código:

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes>
#include <Controls>
#include <StdCtrls>
#include <Forms>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
        TEdit *Edit1;
        TEdit *Edit2;
private:   // User declarations
   static HHOOK hh;
   static LRESULT CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam,TComponent* Owner);
public:      // User declarations
   __fastcall TForm1(TComponent* Owner);
   __fastcall ~TForm1();
};
HHOOK TForm1::hh = 0;
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Luego modificar el "Unit1.cpp"

Código:

//---------------------------------------------------------------------------

#include <vcl>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    hh = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyProc, HInstance, 0);
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
    UnhookWindowsHookEx(hh);
}
//---------------------------------------------------------------------------

LRESULT CALLBACK TForm1::KeyProc(int code, WPARAM wParam, LPARAM lParam,TComponent* Owner)
{
    static DWORD const VK_A = VkKeyScan('a');

    if (code >= 0)
    {
        if (wParam == WM_KEYDOWN)
        {

             PKBDLLHOOKSTRUCT hs = (PKBDLLHOOKSTRUCT)lParam;
             Form1->Edit1->Text=char(hs->vkCode); // Mostramos el caracter
             Form1->Edit2->Text=hs->vkCode; // Mostramos el numero ASCII
        }
    }
    return CallNextHookEx(hh, code, wParam, lParam);
}
//-------------------------------------------------------------------------
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Re: SOLUCIONADO!!! Responder citando

Utiliza el componente TApplicationEvents y coloca el codigo en el evento OnMessage
Código:
static DWORD const VK_A = VkKeyScan('a');
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
    if (code >= 0)
    {
        if (wParam == WM_KEYDOWN)
        {

             PKBDLLHOOKSTRUCT hs = (PKBDLLHOOKSTRUCT)lParam;
             Form1->Edit1->Text=char(hs->vkCode); // Mostramos el caracter
             Form1->Edit2->Text=hs->vkCode; // Mostramos el numero ASCII
        }
    }
    return CallNextHookEx(hh, code, wParam, lParam);
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

vizca321, creo que te equivocaste al interpretar el tema. No se trata de interceptar los mensajes que se envíen a ventanas de tu aplicación, que se hace como expones, aunque también existen otros modos. Se trata de realizar un Hook al teclado, interceptando cualquier pulsación sea cual sea y en cualquier aplicación.

SetWindowsHookEx, WH_KEYBOARD_LL

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

escafandra escribió:
vizca321, creo que te equivocaste al interpretar el tema. No se trata de interceptar los mensajes que se envíen a ventanas de tu aplicación, que se hace como expones, aunque también existen otros modos. Se trata de realizar un Hook al teclado, interceptando cualquier pulsación sea cual sea y en cualquier aplicación.

SetWindowsHookEx, WH_KEYBOARD_LL

Saludos.


Disculpa esque solo me deje llevar, de todas formas creo que usando este componente pueden lograr lo que quieren lo vi en un tema que trataba de un teclado para touchscreen y creo que lo pueden buscar de esta forma.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

vizca321 No debes pedir disculpas, nadie se ha molestado. Mi comentario iba encaminado a aclararte la diferencia entre un Hook, que puede interceptar dentro o fuera de tu aplicación, y la captación de Mensajes dirigidos sólo a ventanas de tu aplicación mediante TApplicationEvents.

Perdona tu por darte otra impresión.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¿Un codigo para capturar click de cualquier boton del raton utilizando hooks? es decir para que funcione fuera de mi aplicación.


Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:
HHOOK WHookMouse = 0;

//---------------------------------------------------------------------------
void __fastcall TForm1::Hook()
{
   if(WHookMouse == 0)
     WHookMouse = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)MouseHookCallBack, HInstance, 0);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::UnHook()
{
   UnhookWindowsHookEx(WHookMouse);
   WHookMouse = 0;
}

//---------------------------------------------------------------------------
LRESULT CALLBACK
MouseHookCallBack(int Code, WPARAM wParam, LPARAM lParam)
{
   if(Code>=0){
    // Por ejemplo:
    if(wParam == WM_LBUTTONDOWN){
      MessageBox(0, "Pulsó el botón Izquierdo del ratón", "WH_MOUSE_LL Hook", MB_ICONINFORMATION);
    }
   }
   return CallNextHookEx(WHookMouse, Code, wParam, lParam);
}



Revisa esto: SetWindowsHookEx, WH_MOUSE_LL

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.