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

前端之家收集整理的这篇文章主要介绍了如何使用SetWindowsHookEx和WH_KEYBOARD挂钩外部进程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图挂钩例如记事本没有成功.制作全局钩子似乎工作正常.

在XP SP2上测试.

编辑:修改后的代码现在有效.

MyDLL代码

  1. #include <windows.h>
  2. #include <iostream>
  3. #include <stdio.h>
  4.  
  5. HINSTANCE hinst;
  6. #pragma data_seg(".shared")
  7. HHOOK hhk;
  8. #pragma data_seg()
  9. //#pragma comment(linker,"/SECTION:.shared,RWS") compiler error in VC++ 2008 express
  10.  
  11. LRESULT CALLBACK wireKeyboardProc(int code,WPARAM wParam,LPARAM lParam) {
  12. if (code < 0) {
  13. return CallNextHookEx(0,code,wParam,lParam);
  14. }
  15. Beep(1000,20);
  16. return CallNextHookEx(hhk,lParam);
  17. }
  18.  
  19. extern "C" __declspec(dllexport) void install(unsigned long threadID) {
  20. hhk = SetWindowsHookEx(WH_KEYBOARD,wireKeyboardProc,hinst,threadID);
  21. }
  22. extern "C" __declspec(dllexport) void uninstall() {
  23. UnhookWindowsHookEx(hhk);
  24. }
  25.  
  26. BOOL WINAPI DllMain(__in HINSTANCE hinstDLL,__in DWORD fdwReason,__in LPVOID lpvReserved) {
  27. hinst = hinstDLL;
  28. return TRUE;
  29. }

我的节目

  1. #include <Windows.h>
  2.  
  3. unsigned long GetTargetThreadIdFromWindow(char *className,char *windowName)
  4. {
  5. HWND targetWnd;
  6. HANDLE hProcess;
  7. unsigned long processID = 0;
  8.  
  9. targetWnd = FindWindow(className,windowName);
  10. return GetWindowThreadProcessId(targetWnd,&processID);
  11. }
  12.  
  13. int _tmain(int argc,_TCHAR* argv[]) {
  14. unsigned long threadID = GetTargetProcessIdFromWindow("Notepad","Untitled - Notepad");
  15. printf("TID: %i",threadID);
  16.  
  17. HINSTANCE hinst = LoadLibrary(_T("MyDLL.dll"));
  18.  
  19. if (hinst) {
  20. typedef void (*Install)(unsigned long);
  21. typedef void (*Uninstall)();
  22.  
  23. Install install = (Install) GetProcAddress(hinst,"install");
  24. Uninstall uninstall = (Uninstall) GetProcAddress(hinst,"uninstall");
  25.  
  26. install(threadID);
  27.  
  28. Sleep(20000);
  29.  
  30. uninstall();
  31. }
  32.  
  33. return 0;
  34. }
三个问题:

您应该在使用线程ID时使用进程ID.

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

  1. #pragma data_seg(".shared")
  2. HHOOK hhk = NULL;
  3. #pragma data_seg()
  4. #pragma comment(linker,RWS")

您需要将HHOOK传递给CallNextHookEx:

  1. return CallNextHookEx( hhk,lParam);

猜你在找的Windows相关文章