 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
eepel Cdt

Registrado: 28 Abr 2007Mensajes: 18
|
Publicado: Jue 22 Ene, 2009 9:50 pm Asunto: Hook (detectar tecla presionada) |
|
|
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 |
|
 |
eepel Cdt

Registrado: 28 Abr 2007Mensajes: 18
|
Publicado: Vie 23 Ene, 2009 12:04 am Asunto: SOLUCIONADO!!! |
|
|
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 |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Sab 24 Ene, 2009 9:22 am Asunto: Re: SOLUCIONADO!!! |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 24 Ene, 2009 11:19 pm Asunto: |
|
|
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 |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Sab 31 Ene, 2009 7:50 pm Asunto: |
|
|
| 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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Dom 01 Feb, 2009 12:08 pm Asunto: |
|
|
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 |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Mar 03 Feb, 2009 10:07 am Asunto: |
|
|
¿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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 03 Feb, 2009 12:13 pm Asunto: |
|
|
| 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 |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Lun 09 Feb, 2009 4:32 pm Asunto: |
|
|
| gracias |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|