2009-05-04 7 views
6

के साथ बाहरी प्रक्रिया को कैसे हुक करें मैं बिना किसी आवश्यकता के नोटपैड उदाहरण के लिए हुक करने की कोशिश कर रहा हूं। एक वैश्विक हुक बनाना ठीक काम करता प्रतीत होता है।SetWindowsHookEx और WH_KEYBOARD

XP SP2 पर परीक्षण।

संपादित करें: संशोधित कोड अब काम करता है।

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

मेरे कार्यक्रम

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

उत्तर

13

तीन समस्याओं:

आप प्रक्रिया ID उपयोग करते समय आपको धागा आईडी का उपयोग करना चाहिए।

आपका HHOOK साझा स्मृति में जाने की जरूरत है:

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

उत्तीर्ण होने के लिए की जरूरत है अपने HHOOKCallNextHookEx रहे हैं:

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

GetWindowThreadProcessId() धागा आईडी की जरूरत है देता है (इसकी वापसी मान के रूप में) । इनलाइन असेंबलर और रीडप्रोसेस मेमरी के साथ आप जो कुछ भी कर रहे हैं, वह आवश्यक नहीं है, और लगभग निश्चित रूप से काम नहीं कर रहा है। – RichieHindle

+2

आपको 'hhk' से '0' को प्रारंभ करने की भी आवश्यकता है या इसे ठीक से साझा नहीं किया जाएगा – yoyoyoyosef

+0

@Yoyoyoyosef: धन्यवाद - निश्चित। – RichieHindle

संबंधित मुद्दे