2009-05-04 24 views
6

ile harici işlem nasıl bağlanır Örneğin, Notepad'i başarıya ulaşmaya çalışıyorum. Küresel bir kanca yapmak iyi çalışıyor gibi görünüyor.SetWindowsHookEx ve WH_KEYBOARD

XP SP2'de sınama.

Düzeltme: Şimdi değiştirilen kod çalışıyor.

MyDLL kodu

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

Programım

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

cevap

13

Üç sorunlar:

Eğer iplik kimliğini kullanarak gerekirken Sen işlem kimliğini kullanıyoruz.

Kişisel HHOOK paylaşılan belleğe gitmek gerekir:

#pragma data_seg(".shared") 
HHOOK hhk = NULL; 
#pragma data_seg() 
#pragma comment(linker, "/SECTION:.shared,RWS") 
kazanmak için geçmeniz gereken

senin HHOOKCallNextHookEx için:

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

GetWindowThreadProcessId() ihtiyacınız iplik kimliği döndürür (dönüş değeri olarak) . Inline assembler ve ReadProcessMemory ile ne yapıyorsanız yapın, ve neredeyse kesinlikle çalışmıyor. – RichieHindle

+2

ayrıca "hhk" yi "0" olarak başlatmanız veya düzgün şekilde paylaşılmaması gerekir – yoyoyoyosef

+0

@yoyoyoyosef: Thanks - fixed. – RichieHindle