Keyboard hook windows desde dll

Iniciado por patilanz, 31 Diciembre 2014, 16:59 PM

0 Miembros y 2 Visitantes están viendo este tema.

patilanz

Hola quiero poner un hook al teclado y he hecho esto:

Código (cpp) [Seleccionar]
#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:

Código (cpp) [Seleccionar]
#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

ThunderCls

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:

Código (cpp) [Seleccionar]
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
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

patilanz

Gracias por tu respuesta. Luego pruebo como me dijiste pero en la pagina de microsoft para el argumento de HOOKPROC dice
CitarIf 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

ThunderCls

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
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

patilanz

#4
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

Código (cpp) [Seleccionar]
#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  ;D Pero por favor responde me a lo  anterior.

ThunderCls

-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/