在Windows中,设置键盘钩子很多人都做过,但是在windows Mobile系统中并没有直接的函数支持。但是我们可以通过使用undocument api来实现。
一、定义参数
- #defineWH_KEYBOARD_LL20
- #defineHC_ACTION0
- typedefLRESULT(CALLBACK*HOOKPROC)(intcode,WPARAMwParam,LPARAMlParam);
- typedefHHOOK (WINAPI*_SetWindowsHookExW)(int,HOOKPROC,HINSTANCE,DWORD);
- typedefLRESULT (WINAPI*_CallNextHookEx)(HHOOK,int,WPARAM,LPARAM);
- typedefLRESULT (WINAPI*_UnhookWindowsHookEx)(HHOOK);
- typedefstruct
- {
- DWORDvkCode;
- DWORDscanCode;
- DWORDflags;
- DWORDtime;
- ULONG_PTRdwExtraInfo;
- }KBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT;
- static_SetWindowsHookExWSetWindowsHookEx;
- static_UnhookWindowsHookExUnhookWindowsHookEx;
- static_CallNextHookExCallNextHookEx;
二、实现代码
LLKeyboardHookCallbackFunction就是回调函数
- BOOLActivateKBHook(HINSTANCEhInstance,
- HOOKPROCLLKeyboardHookCallbackFunction)
- {
- //weneedtomanuallyloadthesestandardWin32APIcalls
- //MSDNstatesthatthesearen''tsupportedinWinCE
- SetWindowsHookEx=NULL;
- CallNextHookEx=NULL;
- UnhookWindowsHookEx=NULL;
- //从coredll.dll获取我们需要的函数
- g_hHookApiDLL=LoadLibrary(_T("coredll.dll"));
- if(g_hHookApiDLL==NULL)
- {
- returnFALSE;
- }
- else
- {
- SetWindowsHookEx=(_SetWindowsHookExW)GetProcAddress(
- g_hHookApiDLL,_T("SetWindowsHookExW"));
- if(SetWindowsHookEx==NULL)
- {
- returnFALSE;
- }
- else
- {
- g_hInstalledLLKBDhook=SetWindowsHookEx(WH_KEYBOARD_LL,
- LLKeyboardHookCallbackFunction,hInstance,0);
- if(g_hInstalledLLKBDhook==NULL)
- {
- returnFALSE;
- }
- }
- CallNextHookEx=(_CallNextHookEx)GetProcAddress(g_hHookApiDLL,
- _T("CallNextHookEx"));
- if(CallNextHookEx==NULL)
- {
- returnFALSE;
- }
- UnhookWindowsHookEx=(_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL,
- _T("UnhookWindowsHookEx"));
- if(UnhookWindowsHookEx==NULL)
- {
- returnFALSE;
- }
- }
- returnTRUE;
- }
- BOOLDeactivateKBHook()
- {
- //unloadthehook
- if(g_hInstalledLLKBDhook!=NULL)
- {
- UnhookWindowsHookEx(g_hInstalledLLKBDhook);
- g_hInstalledLLKBDhook=NULL;
- }
- //unloadthecoredll.dll
- if(g_hHookApiDLL!=NULL)
- {
- FreeLibrary(g_hHookApiDLL);
- g_hHookApiDLL=NULL;
- }
- //wehaveterminatedgracefully
- returnTRUE;
- }
三、消息回调函数
一般的回调函数是这么写的,BlockKeyList是需要屏蔽的按键列表
- intCLoginDlg::BlockKeyList[]={VK_TBACK,VK_TTALK,VK_TEND,VK_THOME};
- LRESULTCALLBACKCLoginDlg::LLKeyboardHookCallbackFunction(intnCode,
- WPARAMwParam,LPARAMlParam)
- {
- if(nCode>=HC_ACTION)
- {
- if(wParam==WM_KEYDOWN||wParam==WM_KEYUP
- ||wParam==WM_LBUTTONDOWN)
- {
- intcountKeyList=ARRAY_SIZEOF(BlockKeyList);
- for(inti=0;i<countKeyList;i++)
- {
- if((((KBDLLHOOKSTRUCT*)lParam)->vkCode)==BlockKeyList[i])
- {
- returnTRUE;
- }
- }
- }
- }
- returnCallNextHookEx(g_hInstalledLLKBDhook,nCode,wParam,lParam);
- }
Windows Mobile下不使用DLL也可以实现全局键盘钩子)
如果你只是要屏蔽所有按键的话可以简单的使用EnableHardwareKeyboard函数来实现。