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 sin utilizar DLL

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Hook sin utilizar DLL Responder citando

He intentado realizar un Hook de teclado sin utilizar una DLL pero no me funciona. He puesto las funciones CALLBACK en el propio código de mi proceso y no se engancha.

Agradecería que alguien pueda ayudarme.

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

Sin ver tu código es difícil saber que ocurre. Puedes probar el siguiente ejemplo a ver que tal te va:

https://cppbuilder.es/viewtopic.php?t=12702
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias _Leo por tu interés.

He colocado lo siguiente:

Código:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  WHookKeyboard = ::SetWindowsHookEx(WH_KEYBOARD_LL, reinterpret_cast<HOOKPROC>(KeyboardHookCallBack), HInstance, 0);
}


Y definido la función CALLBACK:

Código:
LRESULT CALLBACK KeyboardHookCallBack(int Code, WPARAM wParam, LPARAM lParam)
{
    .
    .
    .
    return CallNextHookEx(WHookKeyboard, Code, wParam, lParam);
}



Tengo entendido que para WH_KEYBOARD_LL no hace falta usar dll... El caso es que no me funciona y si lo hace con una dll.

Cuando tenga un poco más de tiempo miro tu ejemplo.

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

Aparentemente esta correcto.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

He probado el ejemplo con Builder 5 y me pasa lo mismo que con mi código. Compila si problemas pero no engancha el Hook. Question

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

Prueba a desactivar el antivirus a ver si puede ser eso.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo escribió:
Prueba a desactivar el antivirus a ver si puede ser eso.


Ya lo he probado y no resulta. Lo que me llama la atención es que si el código del Hook lo coloco en una dll, entonces funciona perfectamente. No soy capaz de entenderlo. No se si depende de mi máquina o del compilador mismo (Builder 5)

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

Definitivamente debe ser el compilador. Lo he probado en delphi y funciona en mi maquina sin necesidad de dll.

Pero me extraña el comportamiento del Builder 5. No me lo explico, aunque puede ser algún bug, ya arreglé uno en los stream clásicos por un errror en el código fuente de Borland. Cuando tenga ocasión lo probaré en Builder 6
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

He creado un hook pero para el mouse y sin usar una dll, ya que mi aplicación así lo requería y despues de ver muchisimo código, sobre todo en delphi encontre lo siguiente:
Código:
bool __fastcall T_wBasePopup::instalarHookMouse()
{
  hookHandle=SetWindowsHookEx(WH_MOUSE,
      reinterpret_cast<HOOKPROC>(hookMousePopup),//mi función hook
      0,
      GetCurrentThreadId());
  return bool(hookHandle!=NULL);
}

Practicamente lo que cambia en relación a tu código son los 2 últimos parámetros de SetWindowsHookEx
Espero que pueda servirte
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias cecito por tu interés.

Me sigue sin funcionar. De todas formas tu implementación
Código:
hookHandle=SetWindowsHookEx(WH_MOUSE,
      reinterpret_cast<HOOKPROC>(hookMousePopup),//mi función hook
      0,
      GetCurrentThreadId());

Es para controlar sólo tu aplicación GetCurrentThreadId(), Así lo entiendo de la documentación de Microsoft. Y así no se puede controlar el teclado globalmente ni, por supuesto, desactivar ciertas teclas de forma global. Para el control del ratón de tu aplicación puede ser perfecto.

Pero, ya te digo, no me funciona. Reitero con dll si funciona y también en delphi 6 Question Sad

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

Intenta asi


Código:
SetWindowsHookEx( WH_KEYBOARD_LL,   (HOOKPROC  )KeyboardHookCallBack,   HInstance,   0);





Sin el reinterpret_cast
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias César, eso también lo intenté y no me funcionó

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

Bueno, no desespero.

Me he dado cuenta que SetWindowsHookEx me devuelve NULO. pero lo curioso es que HInstance es también NULO. Microshoft advierte de que la función puede fallar si hMod (HInstance) y dwThreadId son nulos.

Se da la circunstancia de que si compilo con la función SetWindowsHookEx en algún lugar del código, entonces HInstance se vuelve nulo. Si lo comento, entonces sigue siendo nulo a no ser que obligue a compilarlo todo (Build).

Así es que el problema debe estar en llamar a SetWindowsHookEx con un valor de HInstance nulo, que lo es desde el principio y no tras la llamada.

¿A alguien se le ocurre que es lo que sucede?.

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

Bueno, he creado un nuevo proyecto desde cero y me han desaparecido los problemas. HInstance ya no se convierte en nulo y el Hook funciona. Todavía no se porqué pero está solucionado.

Probando me he encontrado con otra pega. Si programo un Hook del tipo WH_KEYBOARD (no del WH_KEYBOARD_LL) en una DLL y hago:

Código:
WHookKeyboard = ::SetWindowsHookEx(WH_KEYBOARD, reinterpret_cast<HOOKPROC>(KeyboardHookCallBack), hInst, 0);


siendo hinst la HINSTANCE de la DLL y dwThreadId == 0 para que controle todos los threads, entonces encuentro que no controla todos los threads sino solamente a mi aplicación. Pero si el Hook es del tipo WH_KEYBOARD_LL entonces no tiene pega.

¿Alguien me puede explicar que pasa?.

Saludos. Hasta la vuelta de vacaciones.
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.