首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

Windows Mobile 讯息钩子(1)

2012-09-14 
Windows Mobile 消息钩子(1)在Windows中,设置键盘钩子很多人都做过,但是在windows Mobile系统中并没有直接

Windows Mobile 消息钩子(1)

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

一、定义参数
  1. #define WH_KEYBOARD_LL           20 #define HC_ACTION        0 
  2. typedef LRESULT(CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam); typedef HHOOK (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD); 
  3. typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM); typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK); 
  4. typedef struct { 
  5.     DWORD vkCode;     DWORD scanCode; 
  6.     DWORD flags;     DWORD time; 
  7.     ULONG_PTR dwExtraInfo; } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT; 
  8.  static _SetWindowsHookExW       SetWindowsHookEx; 
  9. static _UnhookWindowsHookEx    UnhookWindowsHookEx; static _CallNextHookEx                CallNextHookEx;   

二、实现代码

LLKeyboardHookCallbackFunction就是回调函数

  1. BOOL ActivateKBHook(HINSTANCE hInstance,   HOOKPROC LLKeyboardHookCallbackFunction) 
  2. { //we need to manually load these standard Win32 API calls 
  3. //MSDN states that these aren''t supported in WinCE     SetWindowsHookEx        = NULL; 
  4.     CallNextHookEx            = NULL;     UnhookWindowsHookEx        = NULL; 
  5. //从 coredll.dll 获取我们需要的函数     g_hHookApiDLL = LoadLibrary(_T("coredll.dll")); 
  6.     if(g_hHookApiDLL == NULL)    { 
  7.         return FALSE;     } 
  8.     else     { 
  9.         SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(
  10. g_hHookApiDLL, _T("SetWindowsHookExW"));         if(SetWindowsHookEx == NULL) 
  11.         {             return FALSE; 
  12.         }         else 
  13.         {             g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, hInstance, 0); 
  14.             if(g_hInstalledLLKBDhook == NULL)             { 
  15.                 return FALSE;             } 
  16.         }         CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx")); 
  17.         if(CallNextHookEx == NULL)         { 
  18.             return FALSE;         } 
  19.         UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL,
  20.  _T("UnhookWindowsHookEx"));         if(UnhookWindowsHookEx == NULL) 
  21.         {             return FALSE; 
  22.         }     } 
  23.     return TRUE; } 
  24.  BOOL DeactivateKBHook() 
  25. {     //unload the hook 
  26.     if(g_hInstalledLLKBDhook != NULL)     { 
  27.         UnhookWindowsHookEx(g_hInstalledLLKBDhook);         g_hInstalledLLKBDhook = NULL; 
  28.     }     //unload the coredll.dll 
  29.     if(g_hHookApiDLL != NULL)     { 
  30.         FreeLibrary(g_hHookApiDLL);         g_hHookApiDLL = NULL; 
  31.     }     //we have terminated gracefully 
  32.     return TRUE; } 

三、消息回调函数

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

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

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

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



热点排行