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

上传人:kms****20 文档编号:40387128 上传时间:2018-05-26 格式:DOC 页数:20 大小:62KB
返回 下载 相关 举报
利用底层键盘钩子拦载任意按键(回调版)_第1页
第1页 / 共20页
利用底层键盘钩子拦载任意按键(回调版)_第2页
第2页 / 共20页
利用底层键盘钩子拦载任意按键(回调版)_第3页
第3页 / 共20页
利用底层键盘钩子拦载任意按键(回调版)_第4页
第4页 / 共20页
利用底层键盘钩子拦载任意按键(回调版)_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《利用底层键盘钩子拦载任意按键(回调版)》由会员分享,可在线阅读,更多相关《利用底层键盘钩子拦载任意按键(回调版)(20页珍藏版)》请在金锄头文库上搜索。

1、利用底层键盘钩子拦载任意按键利用底层键盘钩子拦载任意按键( (回调版回调版) )利用底层键盘钩子拦载任意按键(回调版).txt 跌倒了,爬起来再哭低调!才是最牛 B 的炫耀!不吃饱哪有力气减肥啊?真不好意思,让您贱笑了。我能抵抗一切,除了诱惑老子不但有车,还是自行的利用底层键盘钩子拦载任意按键(回调版) -发表日期:2007 年 1 月 12 日 出处:goodname008 的 Blog 作者:卢培培 (goodname008) 【编辑录入:webmaster】 前段时间我曾经写过一篇利用底层键盘钩子屏蔽任意按键 ,并放到了我的 blog 上。这篇文章的题目中把“屏蔽”改成了“拦截” ,显然

2、要比以前的版本强一些了。对于以前写的那个 DLL,有一个不够理想的地方,就是仅仅能实现屏蔽。如果想在屏蔽之前加入一些“小动作” ,就只能修改 DLL,在 LowLevelKeyboardProc 函数中添加代码,实现新的功能。但这样显然不够灵活,这样的 DLL 也不具备一般性了。所以我自然而然地想到了回调,Windows 中有很多需要回调函数的 API,我们当然也可以写出这样的 API,这样做的好处就是可以给 DLL 调用程序留下足够的接口。此时,DLL 就像一个阀门,我们不关心的按键消息就把它放过去,只把我们关心的按键消息拦截下来,然后进一步处理,而这些处理的代码就写在 DLL 调用程序的回

3、调函数中,这样做是最理想不过的了。 相对于前一个版本,修改后的 DLL 源代码如下:/*/* 文件名: MaskKey.cpp */* */* 功能: 标准 DLL - 利用底层键盘钩子实现拦截键盘任意按键 */* */* 作者: 卢培培 (goodname008) 时间: 2005.1.18 */* */* BLOG: http:/ */*/ 导出函数列表/ StartMaskKey/ StopMaskKey#define _WIN32_WINNT 0x0500 / 设置系统版本, 确保可以使用底层键盘钩子#include “windows.h“/ 回调函数指针typedef BOOL (C

4、ALLBACK* LPFNKEYBOARDPROC)(WPARAM, KBDLLHOOKSTRUCT*);/ 全局变量LPDWORD g_lpdwVirtualKey = NULL; / Keycode 数组的指针int g_nLength = 0; / Keycode 数组的大小BOOL g_bDisableKeyboard = FALSE; / 是否屏蔽整个键盘HINSTANCE g_hInstance = NULL; / 模块实例句柄HHOOK g_hHook = NULL; / 钩子句柄LPFNKEYBOARDPROC g_lpfnKeyboardProc; / 键盘钩子回调函数指针/

5、 DLL 入口函数BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)/ 保存模块实例句柄g_hInstance = (HINSTANCE)hModule;/ 在进程结束或线程结束时卸载钩子switch (ul_reason_for_call)case DLL_PROCESS_ATTACH:break;case DLL_THREAD_ATTACH:break;case DLL_PROCESS_DETACH:case DLL_THREAD_DETACH:free(g_lpdwVirtu

6、alKey);if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook);break;return TRUE;/ 底层键盘钩子函数LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)/ 拦截键盘的某些按键, 如果 g_bDisableKeyboard 为 TRUE 则拦截整个键盘按键if (nCode = HC_ACTION)KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;if (g_bDisab

7、leKeyboard) if (g_lpfnKeyboardProc(wParam, pStruct)return CallNextHookEx(g_hHook, nCode, wParam, lParam);elsereturn true;LPDWORD tmpVirtualKey = g_lpdwVirtualKey;for (int i = 0; i vkCode = *tmpVirtualKey+)if (g_lpfnKeyboardProc(wParam, pStruct)return CallNextHookEx(g_hHook, nCode, wParam, lParam);el

8、sereturn true; / 调用系统中的下一个钩子return CallNextHookEx(g_hHook, nCode, wParam, lParam);/*/* 开始拦截键盘按键 */* */* 参数: */* lpdwVirtualKey Keycode 数组的指针 */* nLength Keycode 数组的大小 */* bDisableKeyboard 是否拦截整个键盘 */* */* 返回值: TRUE 成功, FALSE 失败 */*/BOOL WINAPI StartMaskKey(LPDWORD lpdwVirtualKey, int nLength, LPFNKE

9、YBOARDPROC lpfnKeyboardProc, BOOL bDisableKeyboard = FALSE)/ 如果已经安装键盘钩子则返回 FALSEif (g_hHook != NULL | nLength = 0) return FALSE;/ 将用户传来的 keycode 数组保存在全局变量中g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) * nLength);LPDWORD tmpVirtualKey = g_lpdwVirtualKey;for (int i = 0; i nLength; i+)*tmpVirtualKey

10、+ = *lpdwVirtualKey+;g_nLength = nLength;g_bDisableKeyboard = bDisableKeyboard;g_lpfnKeyboardProc = lpfnKeyboardProc;/ 安装底层键盘钩子g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, NULL);if (g_hHook = NULL) return FALSE;return TRUE;/*/* 停止拦截键盘按键 */* */* 参数: (无) */* */* 返回值: T

11、RUE 成功, FALSE 失败 */*/BOOL WINAPI StopMaskKey()/ 卸载钩子if (UnhookWindowsHookEx(g_hHook) = 0) return FALSE;g_hHook = NULL;return TRUE;当然了,MaskKey.h 头文件中也要加上:/ 回调函数指针typedef BOOL (CALLBACK* LPFNKEYBOARDPROC)(WPARAM, KBDLLHOOKSTRUCT*);下面是在 VC 中调用的例子:(两个 Dialog 的成员函数,对应两个按钮,再加上一个回调函数)/ 全局键盘钩子回调函数/ 参数: action 标识键盘消息(按下,弹起), keyStruc

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号