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

2016-01-29 12:59 68 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(){ // 卸

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

延伸阅读
《实况足球2016》PC版手柄及键盘按键操作一览 《实况足球2016》已经上市了,不管是键盘党,还是手柄党,对游戏按键还是需要一定了解。下面图老师图老师小编带来《实况足球2016》PC版手柄及键盘按键操作一览,一起来看吧。 手柄按键: X键:射门、AI队友试压 Y键:直传球、守门员 A键:地面传球、施压 B键:空中传球、飞身铲球 LB...
熟悉MS-Windows和XWindowSystem事件驱动编程模型的开发人员,习惯于传递在某种事件发生时调用(即“回调”)的函数指针。Java的面向对象模型目前并不支持方法指针,这样似乎就不可能使用这种很好的机制。但我们并不是一点办法都没有! !-- frame contents -- !-- /frame contents -- Java的接口支持提供了一种获得回调的等价功...
《武装突袭2箭头行动》键盘按键说明步兵按键 载具按键 上图是台版的中文手册,但游戏内容依然为英文。 《武装突袭2箭头行动》键盘按键说明步兵按键 载具按键 上图是台版的中文手册,但游戏内容依然为英文。 《武装突袭2箭头行动》战役任务"aa、hr、owl"三关完整攻略 战役任务"Amphibious Assault、Harves...
干拦虾仁 4、炒锅内放熟猪油,中火烧至八成热时倒入虾仁用 铁筷子急速拨开,炸至皮面干挺呈红色时捞出; 5、炒锅内留油,用中火烧至六成热时,放入葱、姜末、炸出香味后倒入虾仁、酱油、黄酒、味精,颠翻炒匀装盘即成。备熟猪油750克,实耗约100克。河虾:食虾时严禁同时服用大量 维生素c,否则,可生成三价砷,能致死;虾不宜与猪肉同食,易损...史上最全...
《索尼克:世代》键盘和手柄按键设置 一、先在ConfigruationTool.exe设置好按键 保存 二、找到我的文档/my games/sonic generations/saved games文件夹当中的playerinput.cfg 三、用txt模式打开 把其中的内容整个覆盖到游戏安装目录下的DefaultInput文件中(DefualtInput是用来重置按键的 里面保存的是按键初始值) 四、覆盖之后到Configruat...

经验教程

525

收藏

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