读书人

Windows Mobile 讯息钩子(1)

发布时间: 2012-09-14 23:00:49 作者: rapoo

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函数来实现。



读书人网 >Windows Mobile

热点推荐