2009-05-04 7 views
6

Estoy tratando de enganchar, por ejemplo, el Bloc de notas sin éxito. Hacer un gancho global parece funcionar bien.Cómo conectar un proceso externo con SetWindowsHookEx y WH_KEYBOARD

Prueba en XP SP2.

Editar: El código modificado funciona ahora.

código MyDLL

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

HINSTANCE hinst; 
#pragma data_seg(".shared") 
HHOOK hhk; 
#pragma data_seg() 
//#pragma comment(linker, "/SECTION:.shared,RWS") compiler error in VC++ 2008 express 

LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam,LPARAM lParam) { 
    if (code < 0) { 
     return CallNextHookEx(0, code, wParam, lParam); 
    } 
    Beep(1000, 20); 
    return CallNextHookEx(hhk, code, wParam, lParam); 
} 

extern "C" __declspec(dllexport) void install(unsigned long threadID) { 
    hhk = SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc, hinst, threadID); 
} 
extern "C" __declspec(dllexport) void uninstall() { 
    UnhookWindowsHookEx(hhk); 
} 

BOOL WINAPI DllMain(__in HINSTANCE hinstDLL, __in DWORD fdwReason, __in LPVOID lpvReserved) { 
    hinst = hinstDLL; 
    return TRUE; 
} 

Mi programa

#include <Windows.h> 

unsigned long GetTargetThreadIdFromWindow(char *className, char *windowName) 
{ 
    HWND targetWnd; 
    HANDLE hProcess; 
    unsigned long processID = 0; 

    targetWnd = FindWindow(className, windowName); 
    return GetWindowThreadProcessId(targetWnd, &processID); 
} 

int _tmain(int argc, _TCHAR* argv[]) { 
    unsigned long threadID = GetTargetProcessIdFromWindow("Notepad", "Untitled - Notepad"); 
    printf("TID: %i", threadID);  

    HINSTANCE hinst = LoadLibrary(_T("MyDLL.dll")); 

    if (hinst) { 
     typedef void (*Install)(unsigned long); 
     typedef void (*Uninstall)(); 

     Install install = (Install) GetProcAddress(hinst, "install"); 
     Uninstall uninstall = (Uninstall) GetProcAddress(hinst, "uninstall"); 

     install(threadID); 

     Sleep(20000); 

     uninstall(); 
    } 

    return 0; 
} 

Respuesta

13

tres problemas:

Estás utilizando el ID de proceso cuando se debe utilizar el ID del hilo.

Su HHOOK tiene que ir en la memoria compartida:

#pragma data_seg(".shared") 
HHOOK hhk = NULL; 
#pragma data_seg() 
#pragma comment(linker, "/SECTION:.shared,RWS") 

Es necesario para pasar su HHOOK a CallNextHookEx:

return CallNextHookEx(hhk, code, wParam, lParam); 
+1

GetWindowThreadProcessId() devuelve el ID del hilo que necesita (como su valor de retorno) . Lo que sea que esté haciendo con el ensamblador en línea y ReadProcessMemory no es necesario, y casi seguro que no funciona. – RichieHindle

+2

también debe inicializar 'hhk' a' 0' o no se compartirá correctamente – yoyoyoyosef

+0

@yoyoyoyosef: Gracias - corregido. – RichieHindle

Cuestiones relacionadas