2009-05-04 40 views
6

Tôi đang cố gắng móc ví dụ Notepad không thành công. Làm một cái móc toàn cầu dường như hoạt động tốt.Cách móc quá trình bên ngoài bằng SetWindowsHookEx và WH_KEYBOARD

Thử nghiệm trên XP SP2.

Chỉnh sửa: Mã sửa đổi hoạt động ngay bây giờ.

mydll đang

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

chương trình My

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

Trả lời

13

Ba vấn đề:

Bạn đang sử dụng quá trình ID khi bạn nên sử dụng các thread ID.

HHOOK của bạn cần phải đi vào bộ nhớ chia sẻ:

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

Bạn cần phải vượt qua bạn HHOOK để CallNextHookEx:

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

GetWindowThreadProcessId() trả về ID chủ đề mà bạn cần (như giá trị trả về của nó) . Bất cứ điều gì bạn đang làm với lắp ráp nội tuyến và ReadProcessMemory là không cần thiết, và gần như chắc chắn không làm việc. – RichieHindle

+2

bạn cũng cần phải khởi tạo 'hhk' thành' 0' hoặc nó sẽ không được chia sẻ đúng cách – yoyoyoyosef

+0

@yoyoyoyosef: Cảm ơn - đã sửa. – RichieHindle

Các vấn đề liên quan