分享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中留言。

posted on 2013-01-26 19:03  zhuyf87  阅读(818)  评论(3编辑  收藏  举报

导航