分享WinCE钩子封装库
在最近的项目中,需要使用WinCE的键盘钩子。具体是勾住WinCE终端的扫描按键。翻出自己以前的旧程序,重新封装了一下。现在分享出来,如果大家的项目中也需要用到键盘钩子或者鼠标钩子,又不想在这上面花费太多时间的话,假如你搜索到了这个帖子,不妨试用一下我封装的这个。
CeHook.dll导出6个函数:
#ifndef _CE_HOOK_H_ #define _CE_HOOK_H_ #define DLLCEHOOK_API __declspec(dllexport) #define WM_HOOK_MOUSE WM_USER + 101 #define WM_HOOK_KEYDOWN WM_USER + 102 #define WM_HOOK_KEYUP WM_USER + 103 extern "C" DLLCEHOOK_API BOOL HookInit(HWND hwnd); extern "C" DLLCEHOOK_API BOOL HookDeinit(); extern "C" DLLCEHOOK_API BOOL EnableKeyHook(BYTE vkCodes[], UINT vkNumber); extern "C" DLLCEHOOK_API BOOL DisableKeyHook(); extern "C" DLLCEHOOK_API BOOL EnableMouseHook(); extern "C" DLLCEHOOK_API BOOL DisableMouseHook(); #endif // _CE_HOOK_H_
在使用钩子之前,先调用HookInit函数进行初始化,参数hwnd是希望接收钩子消息的窗口句柄。钩子使用完毕之后,调用HookDeinit函数进行资源释放。
EnableKeyHook用来使能键盘钩子。可以通过参数vkCodes传递自己想捕捉的按键的虚拟键值,vkNumber是vcCodes中的虚拟键的数量。
BYTE vkCodes[4] = {VK_APP1, VK_APP4, VK_APP5, VK_APP6}; BOOL returnValue = EnableKeyHook(vkCodes, 4);
调用DisableKeyHook函数停止使用键盘钩子。
EnableMouseHook和DisableMouseHook分别用来使能和禁能鼠标钩子。
头文件中还定义了三个自定义消息值:WM_HOOK_MOUSE、WM_HOOK_KEYDOWN、WM_HOOK_KEYUP。分别代表鼠标消息、按键按下和按键抬起。其中WM_HOOK_KEYDOWN和WM_HOOK_KEYUP的wParam会传回本次按下的按键的虚拟键值。
再简单介绍下MFC Dialog程序,处理自定义消息的方法。
(1)消息处理函数声明:
afx_msg LRESULT OnHookKeyDown(WPARAM wParam, LPARAM lParam);
(2)消息映射:
ON_MESSAGE(WM_HOOK_KEYDOWN, OnHookKeyDown)
(3)消息处理函数实现:
LRESULT CCeHookTestDlg::OnHookKeyDown(WPARAM wParam, LPARAM lParam) { DWORD vkCode = (DWORD) wParam; CString msg; msg.Format(_T("Virtual Key Code: 0x%04x is down."), vkCode); MultiThreadMessageBox(msg, _T("CeHook"), MB_OK); return 0; }
贴几张我的测试程序的图片,测试平台是Windows Mobile 6.1。
最后,如果大家在自己的项目中需要使用到钩子,之前又没自己封装过。想节省时间直接用现成的,不妨到这里留下邮箱。我会将封装库和测试程序(SDK:WM6.1)发给你。我在钩子程序中加了日志,会在根目录下生成一个CeHook@zhuyf.log文件,如果不想要这个日志,或者在使用中有什么问题的可以在我的blog中留言。