WEB开发网
开发学院软件开发VC 利用底层键盘钩子拦载任意按键(回调版) 阅读

利用底层键盘钩子拦载任意按键(回调版)

 2007-11-26 21:37:59 来源:WEB开发网   
核心提示: 当然了,MaskKey.h头文件中也要加上:// 回调函数指针typedef BOOL (CALLBACK* LPFNKEYBOARDPROC)(WPARAM, KBDLLHOOKSTRUCT*);下面是在VC中调用的例子:(两个Dialog的成员函数,利用底层键盘钩子拦载任意按键(回调版

当然了,MaskKey.h头文件中也要加上:

// 回调函数指针
typedef BOOL (CALLBACK* LPFNKEYBOARDPROC)(WPARAM, KBDLLHOOKSTRUCT*);

下面是在VC中调用的例子:(两个Dialog的成员函数,对应两个按钮,再加上一个回调函数)

// 全局键盘钩子回调函数
// 参数: action 标识键盘消息(按下,弹起), keyStruct 包含按键信息
BOOL CALLBACK KeyboardProc(WPARAM action, KBDLLHOOKSTRUCT* pKeyStruct)
{
// 判断按键动作
switch (action)
{
case WM_KEYDOWN:
break;
case WM_KEYUP:
break;
case WM_SYSKEYDOWN:
break;
case WM_SYSKEYUP:
break;
}
// 返回 true 表示继续传递按键消息
// 返回 false 表示结束按键消息传递
return false;
}
void CMaskKeyAppDlg::OnStartmaskkey()
{
// 屏蔽 A, B, C, 上, 下, 左, 右及两个win键
DWORD dwVK[] = {'A', 'B', 'C', VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, VK_LWIN, VK_RWIN};
int nLength = sizeof(dwVK) / sizeof(DWORD);
StartMaskKey(dwVK, nLength, KeyboardProc);  
}
void CMaskKeyAppDlg::OnStopmaskkey()
{
StopMaskKey();
}

呵呵,这样是不是让看到这里的你很兴奋呢?!StartMaskKey加了一个参数,是个函数指针,这是我们非常熟悉的回调函数的使用方法。DLL中的StartMaskKey函数收到这个函数指针后保存在了g_lpfnKeyboardProc变量中,然后在LowLevelKeyboardProc中一旦发现了要拦截的按键,就会通过函数指针调用回调函数,将控制权完全交回给DLL的调用程序,由回调函数KeyboardProc进一步处理(播放一小段音乐,还是执行个什么有意思的程序,亦或是重启关机什么的。呃,随你便了。:D),action参数用来标识键盘消息(按下或弹起),pKeyStruct参数包含了丰富的按键信息,其实就是系统传给LowLevelKeyboardProc的lParam,我又把它原封不动地传给了KeyboardProc,呵呵。最重要的就是回调函数的返回值了,它就像阀门的开关一样,将决定这个按键消息的命运。从DLL中的LowLevelKeyboardProc函数的流程可以看出,如果回调函数KeyboardProc的返回值为true则表示把该按键消息继续传递给系统中的下一个钩子;如果为false则表示结束该按键消息的传递,此时将会起到拦截按键的效果。

Tags:利用 底层 键盘

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接