| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 11 Jul, 2008 11:32 pm Asunto: Hook sin utilizar DLL |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 12 Jul, 2008 1:46 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Sab 12 Jul, 2008 2:10 am Asunto: |
|
|
| Aparentemente esta correcto. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 12 Jul, 2008 2:27 am Asunto: |
|
|
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.
Saludos. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Sab 12 Jul, 2008 3:11 am Asunto: |
|
|
| Prueba a desactivar el antivirus a ver si puede ser eso. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 12 Jul, 2008 11:59 am Asunto: |
|
|
| _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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 12 Jul, 2008 12:09 pm Asunto: |
|
|
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 |
|
 |
cecito Capt

Registrado: 25 Nov 2003Mensajes: 164Ubicación: Arequipa - Perú
|
Publicado: Sab 12 Jul, 2008 2:18 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 12 Jul, 2008 2:49 pm Asunto: |
|
|
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
Saludos y mil gracias. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 12 Jul, 2008 7:52 pm Asunto: |
|
|
Intenta asi
| Código: | SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC )KeyboardHookCallBack, HInstance, 0); |
Sin el reinterpret_cast _________________
 |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Dom 13 Jul, 2008 1:49 am Asunto: |
|
|
Gracias César, eso también lo intenté y no me funcionó
Saludos. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Dom 13 Jul, 2008 3:11 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 15 Jul, 2008 9:16 pm Asunto: |
|
|
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 |
|
 |
|