Autor
|
Tema: Keyboard hook windows desde dll (Leído 3,230 veces)
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Hola quiero poner un hook al teclado y he hecho esto: #include <Windows.h> #include <iostream> #include <vector> using namespace std; int main(){ HINSTANCE library = LoadLibrary("dll_hook.dll"); if (library){ cout << "ok"; } HOOKPROC cellback = (HOOKPROC)GetProcAddress(library, "hookProc"); HHOOK hhook = SetWindowsHookEx( WH_KEYBOARD_LL, cellback, library, 0); if (hhook == NULL){ int a = GetLastError(); cout << "Error"; } else{ cout << "Done!"; } getchar(); return 0; }
Y la dll: #include "hookProc.h" #include <Windows.h> #include <iostream> using namespace std; extern "C"{ LRESULT __declspec(dllexport) hookProc(int code, WPARAM wparam, LPARAM lparam){ cout << code; cout << wparam; cout << lparam; if (code < 0){ return CallNextHookEx(0, code, wparam, lparam); } else if (code >= 0){ if (wparam == VK_LBUTTON){ cout << "Left button pressed!" << endl; } } return CallNextHookEx(0, code, wparam, lparam); } }
Me muestra ok y done pero luego al presionar una tecla la aplicación deja de responder y tengo que cerrar la. Me pueden ayudar ? Saludos
|
|
« Última modificación: 31 Diciembre 2014, 19:51 pm por patilanz »
|
En línea
|
|
|
|
ThunderCls
Desconectado
Mensajes: 455
Coder | Reverser | Gamer
|
Te recomendaria que para eso no uses una DLL, mejor usa un Hook de teclado global desde tu mismo exe con WH_KEYBOARD_LL, seria algo como esto: LRESULT CALLBACK LL_KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam) { // Tu codigo para manejar los mensajes aqui } int main() { // Instala el hook global de teclado HHOOK gkHook = SetWindowsHookEx(WH_KEYBOARD_LL, LL_KeyboardHook, 0, 0); // Haces tu loop aqui o lo q quieras UnhookWindowsHookEx(gkHook); return(0); }
Saludos
|
|
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Gracias por tu respuesta. Luego pruebo como me dijiste pero en la pagina de microsoft para el argumento de HOOKPROC dice If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a DLL. Otherwise, lpfn can point to a hook procedure in the code associated with the current process. http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx Yo necesito que el id del thread sea 0 para hacer un hook global? Saludos
|
|
|
En línea
|
|
|
|
ThunderCls
Desconectado
Mensajes: 455
Coder | Reverser | Gamer
|
Creo q no lo tienes del todo claro, echale una ojeada a estos links y entenderas la diferencia entre WH_KEYBOARD_LL y WH_KEYBOARD: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ms644984(v=vs.85).aspx Por si acaso te quedas igual, te lo digo en pocas palabras, instalando un Hook usando WH_KEYBOARD solo te da un gancho en el contexto actual desde donde se instalo dicho gancho, por esto para hacer un hook en otros procesos (contextos) necesitas inyectar una DLL en dichos procesos para poder ubicarte en el contexto de dicha app. Por otra parte usando WH_KEYBOARD_LL no necesitas una DLL por separado pues el metodo es diferente, ya q el gancho es a nivel de SO, por lo q cada vez q surja un evento de teclado en cualquier app, el SO hara automaticamente un cambio de contexto al de tu propia app donde reside el codigo del gancho para procesarla y luego vuelve al contexto de la app anterior. Espero hayas captado la idea Saludos
|
|
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Creo que con esto ya me quedo claro, muchas gracias . Se puede inyectar un dll a mi propia aplicación ? Solo por curiosidad. Hice otro código pero tampoco funciona #include <Windows.h> #include <iostream> #include <vector> using namespace std; HHOOK hhook; LRESULT CALLBACK LowLevelKeyboardHook(int code , WPARAM wparam, LPARAM lparam) cout << code; return CallNextHookEx(hhook, code, wparam, lparam); } int main(){ hhook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardHook, 0, 0); if (hhook == NULL){ int a = GetLastError(); cout << "Error"; } else{ cout << "Done!"; } getchar(); UnhookWindowsHookEx(hhook); return 0; }
Cuando pulso una tecla se bloquean los eventos y al cabo de unos 20 segundos el evento pasa a la aplicación donde se pulso pero por mi función no. Con WH_MOUSE_LL pasa lo mismo. Saludos @Edit: Resulto me faltaba el loop de mensajes Pero por favor responde me a lo anterior.
|
|
« Última modificación: 2 Enero 2015, 13:32 pm por patilanz »
|
En línea
|
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
hacer un Irda Keyboard
Electrónica
|
rieju
|
1
|
3,143
|
17 Noviembre 2004, 06:41 am
por rieju
|
|
|
Keyboard Hook no detecta teclas en una aplicación en concreto
.NET (C#, VB.NET, ASP)
|
rmva2
|
5
|
5,666
|
15 Diciembre 2011, 16:53 pm
por rmva2
|
|
|
Fallo al abrir handles durante hook de API de Windows
Programación C/C++
|
Halos
|
1
|
1,994
|
8 Abril 2013, 15:11 pm
por Halos
|
|
|
Hook global para los Windows Messages?
.NET (C#, VB.NET, ASP)
|
Eleкtro
|
5
|
3,727
|
1 Julio 2013, 11:02 am
por Eleкtro
|
|
|
Hook Library Windows
Ingeniería Inversa
|
Geovane
|
0
|
1,862
|
30 Octubre 2018, 16:05 pm
por Geovane
|
|