当前位置: 代码迷 >> Windows Mobile >> Windows Mobile 讯息钩子(1)
  详细解决方案

Windows Mobile 讯息钩子(1)

热度:50   发布时间:2016-04-25 07:37:27.0
Windows Mobile 消息钩子(1)

    在Windows中,设置键盘钩子很多人都做过,但是在windows Mobile系统中并没有直接的函数支持。但是我们可以通过使用undocument api来实现。

一、定义参数

  1. #define WH_KEYBOARD_LL           20 
  2. #define HC_ACTION        0 
  3. typedef LRESULT(CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam); 
  4. typedef HHOOK (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD); 
  5. typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM); 
  6. typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK); 
  7. typedef struct 
  8. { 
  9.     DWORD vkCode; 
  10.     DWORD scanCode; 
  11.     DWORD flags; 
  12.     DWORD time; 
  13.     ULONG_PTR dwExtraInfo; 
  14. } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT; 
  15.  
  16. static _SetWindowsHookExW       SetWindowsHookEx; 
  17. static _UnhookWindowsHookEx    UnhookWindowsHookEx; 
  18. static _CallNextHookEx                CallNextHookEx;   

二、实现代码

LLKeyboardHookCallbackFunction就是回调函数

  1. BOOL ActivateKBHook(HINSTANCE hInstance, 
  2.   HOOKPROC LLKeyboardHookCallbackFunction) 
  3. { 
  4. //we need to manually load these standard Win32 API calls 
  5. //MSDN states that these aren''t supported in WinCE 
  6.     SetWindowsHookEx        = NULL; 
  7.     CallNextHookEx            = NULL; 
  8.     UnhookWindowsHookEx        = NULL; 
  9. //从 coredll.dll 获取我们需要的函数 
  10.     g_hHookApiDLL = LoadLibrary(_T("coredll.dll")); 
  11.     if(g_hHookApiDLL == NULL) 
  12.    { 
  13.         return FALSE; 
  14.     } 
  15.     else 
  16.     { 
  17.         SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(
  18. g_hHookApiDLL, _T("SetWindowsHookExW")); 
  19.         if(SetWindowsHookEx == NULL) 
  20.         { 
  21.             return FALSE; 
  22.         } 
  23.         else 
  24.         { 
  25.             g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL,
  26.  LLKeyboardHookCallbackFunction, hInstance, 0); 
  27.             if(g_hInstalledLLKBDhook == NULL) 
  28.             { 
  29.                 return FALSE; 
  30.             } 
  31.         } 
  32.         CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL,
  33.  _T("CallNextHookEx")); 
  34.         if(CallNextHookEx == NULL) 
  35.         { 
  36.             return FALSE; 
  37.         } 
  38.         UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL,
  39.  _T("UnhookWindowsHookEx")); 
  40.         if(UnhookWindowsHookEx == NULL) 
  41.         { 
  42.             return FALSE; 
  43.         } 
  44.     } 
  45.     return TRUE; 
  46. } 
  47.  
  48. BOOL DeactivateKBHook() 
  49. { 
  50.     //unload the hook 
  51.     if(g_hInstalledLLKBDhook != NULL) 
  52.     { 
  53.         UnhookWindowsHookEx(g_hInstalledLLKBDhook); 
  54.         g_hInstalledLLKBDhook = NULL; 
  55.     } 
  56.     //unload the coredll.dll 
  57.     if(g_hHookApiDLL != NULL) 
  58.     { 
  59.         FreeLibrary(g_hHookApiDLL); 
  60.         g_hHookApiDLL = NULL; 
  61.     } 
  62.     //we have terminated gracefully 
  63.     return TRUE; 
  64. } 

三、消息回调函数

一般的回调函数是这么写的,BlockKeyList是需要屏蔽的按键列表

  1. int CLoginDlg::BlockKeyList[] = {VK_TBACK,VK_TTALK,VK_TEND,VK_THOME}; 
  2. LRESULT CALLBACK CLoginDlg::LLKeyboardHookCallbackFunction(int nCode,
  3.  WPARAM wParam, LPARAM lParam) 
  4. { 
  5.     if(nCode >= HC_ACTION) 
  6.     { 
  7.         if(wParam == WM_KEYDOWN || wParam == WM_KEYUP
  8.  || wParam == WM_LBUTTONDOWN) 
  9.         {
  10.             int countKeyList = ARRAY_SIZEOF(BlockKeyList);
  11.             for(int i=0;i<countKeyList;i++) 
  12.             {
  13.                 if((((KBDLLHOOKSTRUCT*)lParam)->vkCode) == BlockKeyList[i])
  14.                 {
  15.                     return TRUE; 
  16.                 } 
  17.             } 
  18.         } 
  19.     } 
  20.     return CallNextHookEx(g_hInstalledLLKBDhook, nCode, wParam, lParam); 
  21. } 

   Windows Mobile下不使用DLL也可以实现全局键盘钩子)

   如果你只是要屏蔽所有按键的话可以简单的使用EnableHardwareKeyboard函数来实现。



  相关解决方案