2009-05-04 10 views
6

Ich versuche, zum Beispiel Notepad ohne Erfolg haken. Einen globalen Haken zu machen scheint gut zu funktionieren.So haken externen Prozess mit SetWindowsHookEx und WH_KEYBOARD

Testen auf XP SP2.

Bearbeiten: Geänderter Code funktioniert jetzt.

MyDLL Code

#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; 
} 

Mein Programm

#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; 
} 

Antwort

13

Drei Probleme:

Sie verwenden die Prozess-ID, wenn Sie die Thread-ID verwendet werden soll.

Ihre hHook muss in den gemeinsamen Speicher gehen:

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

Sie benötigen HHOOK zu CallNextHookEx weitergeben müssen:

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

GetWindowThreadProcessId() gibt die Thread-ID Sie (als Rückgabewert) benötigen . Was auch immer Sie mit Inline-Assembler und ReadProcessMemory machen, ist nicht notwendig und funktioniert mit ziemlicher Sicherheit nicht. – RichieHindle

+2

Sie müssen auch 'hhk' auf' 0' initialisieren oder es wird nicht richtig freigegeben – yoyoyoyosef

+0

@yoyoyoyosef: Danke - behoben. – RichieHindle