HOOK使用:全局键盘钩子


[cpp]  view plain copy
  1. // CatchKey.cpp : Defines the entry point for the DLL application.  
  2. //  
  3.   
  4. #define _WIN32_WINNT  0x0500        //设置系统版本,可以使用底层键盘钩子  
  5. #define WM_MY_SHORTS (WM_USER + 105)  
  6. #include "windows.h"  
  7. //全局变量   
  8. LPWORD      g_lpdwVirtualKey = NULL;    //Keycode 数组的指针   
  9. int         g_nLength = 0;          //Keycode 数组的大小   
  10. HINSTANCE   g_hInstance = NULL;     //模块实例句柄    
  11. HHOOK       g_hHook = NULL;         //钩子句柄   
  12. HWND        g_hWnd  = NULL;    
  13.   
  14.   
  15. BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call,LPVOID lpReserved)   
  16. {    
  17.     //保存模块实例句柄   
  18.     g_hInstance = (HINSTANCE)hModule;   
  19.       
  20.     //在进程结束或线程结束时卸载钩子    
  21.     switch (ul_reason_for_call)   
  22.     {   
  23.     case DLL_PROCESS_ATTACH:   
  24.            break;    
  25.     case DLL_THREAD_ATTACH:  
  26.          break;       
  27.     case DLL_PROCESS_DETACH:   
  28.       case DLL_THREAD_DETACH:    
  29.         delete g_lpdwVirtualKey;    
  30.         if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook);   
  31.         break;  
  32.     }  
  33.     return TRUE;  
  34. }    
  35.   
  36. LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam,LPARAM lParam)  
  37. {   
  38.     //判断是否是有效按键  
  39.     if (nCode >= HC_ACTION && wParam==WM_KEYDOWN)   
  40.     {   
  41.         BOOL bctrl = GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) *8)-1);     
  42.         KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;    
  43.         LPWORD tmpVirtualKey = g_lpdwVirtualKey;    
  44.         if (pStruct->vkCode == 80 && bctrl)    
  45.             PostMessage(g_hWnd,WM_MY_SHORTS,0,1);    
  46.         return TRUE;    
  47.     }   
  48.     //传给系统中的下一个钩子   
  49.     return CallNextHookEx(g_hHook, nCode, wParam, lParam);   
  50. }    
  51.   
  52.  _declspec(dllexport)  
  53. BOOL WINAPI StartCatch(LPWORD lpdwVirtualKey, int nLength,  HWND  pWnd)   
  54. {    
  55.     g_hWnd = pWnd;    
  56.     //如果已经安装键盘钩子则返回 FALSE    
  57.     if (g_hHook != NULL) return FALSE;  
  58.     //将用户传来的 keycode 数组保存在全局变量中   
  59.     g_lpdwVirtualKey = (LPWORD)malloc(sizeof(WORD) * nLength);   
  60.     LPWORD tmpVirtualKey = g_lpdwVirtualKey;   
  61.     for (int i = 0; i < nLength; i++)    
  62.     {   
  63.         *tmpVirtualKey++ = *lpdwVirtualKey++;   
  64.     }   
  65.     g_nLength = nLength;    
  66.     //安装底层键盘钩子    
  67.     g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,  g_hInstance, NULL);    
  68.     if (g_hHook == NULL) return FALSE;   
  69.     return TRUE;    
  70. }    
  71.   
  72.  _declspec(dllexport)  
  73. BOOL WINAPI StopCatch()   
  74. {   //卸载钩子   
  75.     if (UnhookWindowsHookEx(g_hHook) == 0) return FALSE;   
  76.     g_hHook = NULL;   
  77.     return TRUE;   
  78.  }    


 

利用底层的键盘钩子 
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam,LPARAM lParam)
来拦截 按键的时候

键盘的键按下和弹起时候会发生WM_KEYUP 和 WM_KEYDOWN两个消息,
这两个消息都会被hook,所以如此。

所以需要对 wParam 进行判断  是 WM_KEYDOWN 还是 WM_KEYUP

你可能感兴趣的:(HOOK使用:全局键盘钩子)