`
mmdev
  • 浏览: 12880215 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Windows Mobile 消息钩子(1)

 
阅读更多

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

一、定义参数

  1. #defineWH_KEYBOARD_LL20
  2. #defineHC_ACTION0
  3. typedefLRESULT(CALLBACK*HOOKPROC)(intcode,WPARAMwParam,LPARAMlParam);
  4. typedefHHOOK (WINAPI*_SetWindowsHookExW)(int,HOOKPROC,HINSTANCE,DWORD);
  5. typedefLRESULT (WINAPI*_CallNextHookEx)(HHOOK,int,WPARAM,LPARAM);
  6. typedefLRESULT (WINAPI*_UnhookWindowsHookEx)(HHOOK);
  7. typedefstruct
  8. {
  9. DWORDvkCode;
  10. DWORDscanCode;
  11. DWORDflags;
  12. DWORDtime;
  13. ULONG_PTRdwExtraInfo;
  14. }KBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT;
  15. static_SetWindowsHookExWSetWindowsHookEx;
  16. static_UnhookWindowsHookExUnhookWindowsHookEx;
  17. static_CallNextHookExCallNextHookEx;

二、实现代码

LLKeyboardHookCallbackFunction就是回调函数

  1. BOOLActivateKBHook(HINSTANCEhInstance,
  2. HOOKPROCLLKeyboardHookCallbackFunction)
  3. {
  4. //weneedtomanuallyloadthesestandardWin32APIcalls
  5. //MSDNstatesthatthesearen''tsupportedinWinCE
  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. returnFALSE;
  14. }
  15. else
  16. {
  17. SetWindowsHookEx=(_SetWindowsHookExW)GetProcAddress(
  18. g_hHookApiDLL,_T("SetWindowsHookExW"));
  19. if(SetWindowsHookEx==NULL)
  20. {
  21. returnFALSE;
  22. }
  23. else
  24. {
  25. g_hInstalledLLKBDhook=SetWindowsHookEx(WH_KEYBOARD_LL,
  26. LLKeyboardHookCallbackFunction,hInstance,0);
  27. if(g_hInstalledLLKBDhook==NULL)
  28. {
  29. returnFALSE;
  30. }
  31. }
  32. CallNextHookEx=(_CallNextHookEx)GetProcAddress(g_hHookApiDLL,
  33. _T("CallNextHookEx"));
  34. if(CallNextHookEx==NULL)
  35. {
  36. returnFALSE;
  37. }
  38. UnhookWindowsHookEx=(_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL,
  39. _T("UnhookWindowsHookEx"));
  40. if(UnhookWindowsHookEx==NULL)
  41. {
  42. returnFALSE;
  43. }
  44. }
  45. returnTRUE;
  46. }
  47. BOOLDeactivateKBHook()
  48. {
  49. //unloadthehook
  50. if(g_hInstalledLLKBDhook!=NULL)
  51. {
  52. UnhookWindowsHookEx(g_hInstalledLLKBDhook);
  53. g_hInstalledLLKBDhook=NULL;
  54. }
  55. //unloadthecoredll.dll
  56. if(g_hHookApiDLL!=NULL)
  57. {
  58. FreeLibrary(g_hHookApiDLL);
  59. g_hHookApiDLL=NULL;
  60. }
  61. //wehaveterminatedgracefully
  62. returnTRUE;
  63. }

三、消息回调函数

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

  1. intCLoginDlg::BlockKeyList[]={VK_TBACK,VK_TTALK,VK_TEND,VK_THOME};
  2. LRESULTCALLBACKCLoginDlg::LLKeyboardHookCallbackFunction(intnCode,
  3. WPARAMwParam,LPARAMlParam)
  4. {
  5. if(nCode>=HC_ACTION)
  6. {
  7. if(wParam==WM_KEYDOWN||wParam==WM_KEYUP
  8. ||wParam==WM_LBUTTONDOWN)
  9. {
  10. intcountKeyList=ARRAY_SIZEOF(BlockKeyList);
  11. for(inti=0;i<countKeyList;i++)
  12. {
  13. if((((KBDLLHOOKSTRUCT*)lParam)->vkCode)==BlockKeyList[i])
  14. {
  15. returnTRUE;
  16. }
  17. }
  18. }
  19. }
  20. returnCallNextHookEx(g_hInstalledLLKBDhook,nCode,wParam,lParam);
  21. }

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

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



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics