如何使用SetWindowsHookEx和WH_KEYBOARD钩住外部进程

我想挂钩例如记事本没有成功。 做一个全局钩子似乎工作正常。

在XP SP2上testing。

编辑:修正的代码现在工作。

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

Solutions Collecting From Web of "如何使用SetWindowsHookEx和WH_KEYBOARD钩住外部进程"

三个问题:

当您使用线程ID时,您正在使用进程ID。

您的HHOOK需要进入共享内存:

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

您需要将您的HHOOK传递给CallNextHookEx

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