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

2016-01-29 12:59 72 1 收藏

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

【 tulaoshi.com - ASP.NET 】

前段时间我曾经写过一篇《利用底层键盘钩子屏蔽任意按键》,并放到了我的blog上。这篇文章的题目中把“屏蔽”改成了“拦截”,显然要比以前的版本强一些了。对于以前写的那个DLL,有一个不够理想的地方,就是仅仅能实现屏蔽。如果想在屏蔽之前加入一些“小动作”,就只能修改DLL,在LowLevelKeyboardProc函数中添加代码,实现新的功能。但这样显然不够灵活,这样的DLL也不具备一般性了。所以我自然而然地想到了回调,Windows中有很多需要回调函数的API,我们当然也可以写出这样的API,这样做的好处就是可以给DLL调用程序留下足够的接口。此时,DLL就像一个阀门,我们不关心的按键消息就把它放过去,只把我们关心的按键消息拦截下来,然后进一步处理,而这些处理的代码就写在DLL调用程序的回调函数中,这样做是最理想不过的了。 相对于前一个版本,修改后的DLL源代码如下: /********************************************************************//* 文件名: MaskKey.cpp *//* *//* 功能: 标准 DLL ---- 利用底层键盘钩子实现拦截键盘任意按键 *//* *//* 作者: 卢培培 (goodname008) 时间: 2005.1.18 *//* *//* BLOG: http://blog.csdn.net/goodname008 *//********************************************************************/ // 导出函数列表// StartMaskKey// StopMaskKey #define _WIN32_WINNT 0x0500 // 设置系统版本, 确保可以使用底层键盘钩子 #include "windows.h" // 回调函数指针typedef BOOL (CALLBACK* 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; // 键盘钩子回调函数指针 // 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_lpdwVirtualKey); 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_bDisableKeyboard) if (g_lpfnKeyboardProc(wParam, pStruct)) return CallNextHookEx(g_hHook, nCode, wParam, lParam); else return true; LPDWORD tmpVirtualKey = g_lpdwVirtualKey; for (int i = 0; i < g_nLength; i++) { if (pStruct->vkCode == *tmpVirtualKey++) if (g_lpfnKeyboardProc(wParam, pStruct)) return CallNextHookEx(g_hHook, nCode, wParam, lParam); else return true; } } // 调用系统中的下一个钩子 return CallNextHookEx(g_hHook, nCode, wParam, lParam);} /********************************************************************//* 开始拦截键盘按键 *//* *//* 参数: *//* lpdwVirtualKey Keycode 数组的指针 *//* nLength Keycode 数组的大小 *//* bDisableKeyboard 是否拦截整个键盘 *//* *//* 返回值: TRUE 成功, FALSE 失败 *//********************************************************************/BOOL WINAPI StartMaskKey(LPDWORD lpdwVirtualKey, int nLength, LPFNKEYBOARDPROC lpfnKeyboardProc, BOOL bDisableKeyboard = FALSE){ // 如果已经安装键盘钩子则返回 FALSE if (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++ = *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; } /********************************************************************//* 停止拦截键盘按键 *//* *//* 参数: (无) *//* *//* 返回值: TRUE 成功, FALSE 失败 *//********************************************************************/BOOL WINAPI StopMaskKey(){ // 卸

来源:http://www.tulaoshi.com/n/20160129/1488440.html

延伸阅读
标签: 电脑入门
方法/步骤 首先,打开按键精灵软件,进入软件主界面,如下图所示: 点击新建,就进入到编辑脚本的窗口,如下图所示: 我们要通过写脚本命令实现功能,所以我们要在右侧的普通/源文件选择源文件,如下图所示: 假设,我们要将键盘上的Q改为T。首先我们要在窗口左侧的基本命令查询按键码处,查询到Q对应的按键码,如下图所示,Q的按...
《武装突袭2箭头行动》键盘按键说明步兵按键 载具按键 上图是台版的中文手册,但游戏内容依然为英文。 《武装突袭2箭头行动》键盘按键说明步兵按键 载具按键 上图是台版的中文手册,但游戏内容依然为英文。 《武装突袭2箭头行动》战役任务"aa、hr、owl"三关完整攻略 战役任务"Amphibious Assault、Harves...
熟悉MS-Windows和XWindowSystem事件驱动编程模型的开发人员,习惯于传递在某种事件发生时调用(即“回调”)的函数指针。Java的面向对象模型目前并不支持方法指针,这样似乎就不可能使用这种很好的机制。但我们并不是一点办法都没有! !-- frame contents -- !-- /frame contents -- Java的接口支持提供了一种获得回调的等价功...
《索尼克:世代》键盘和手柄按键设置 一、先在ConfigruationTool.exe设置好按键 保存 二、找到我的文档/my games/sonic generations/saved games文件夹当中的playerinput.cfg 三、用txt模式打开 把其中的内容整个覆盖到游戏安装目录下的DefaultInput文件中(DefualtInput是用来重置按键的 里面保存的是按键初始值) 四、覆盖之后到Configruat...
《实况足球2012》键盘党按键设置图文 第一步:在实况2012文件夹下找到settings.exe文件,打开。如图,我的实况装在H盘下。 第二步:在出现的Settings页面下点图中的红圈Keyboard部分,进入设置Keyboard界面。然后点击图上的框框来设置按键。 注意:RT=R2=低俗盘带,急停面向球门等=空格键Space,这个键无法直接通过按空格键来设置,必须点...

经验教程

719

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部