2009-05-04 8 views
6

J'essaye de crocheter par exemple Notepad sans succès. Faire un crochet global semble fonctionner correctement.Comment accrocher le processus externe avec SetWindowsHookEx et WH_KEYBOARD

Test sous XP SP2.

Modifier: Le code modifié fonctionne maintenant.

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

Mon programme

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

Répondre

13

Trois problèmes:

Vous utilisez le processus ID lorsque vous devez utiliser l'ID de fil.

Votre HHOOK doit aller en mémoire partagée:

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

Vous devez passer votre HHOOK à CallNextHookEx:

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

GetWindowThreadProcessId() renvoie l'ID de fil dont vous avez besoin (comme sa valeur de retour) . Tout ce que vous faites avec l'assembleur en ligne et ReadProcessMemory n'est pas nécessaire, et ne fonctionne presque certainement pas. – RichieHindle

+2

vous devez également initialiser 'hhk' à' 0' ou il ne sera pas partagé correctement – yoyoyoyosef

+0

@yoyoyoyosef: Merci - corrigé. – RichieHindle

Questions connexes