1、WH_KEYBOARD 和 WH_KEYBOARD_LL 有什么区别? 很多地方都讲得很笼统。让我感觉就是没区别。2、为什么我使用 WH_KEYBOARD_LL ,编译器告诉我 undeclared symbol? 我查了一下 WH_KEYBOARD_LL 的定义,它在 _WIN32_WINNT > 4000 时会被编译,我不明白这是什么意思。我的系统是Windows2000 professional,开发环境是Visual C++ 6.03、我试图通过修改lParam的值实现过滤键,但不管用? 当我的钩子(WH_KEYBOARD类型的HHOOK)钩到键盘消息时,我把消息的lParam参数的16到23位(资料上写这8位是键盘的扫描码)修改成某一个值,比如0x1E,即键盘上的a,然后把新的lParam作为参数传递给 CallNextHookEx 。我的想法就是不管用户按了什么键,经过我的钩子后都相当于在按“a”键。在调试过程中确认了lParam的16~23位被修改了。
不过这个程序最终什么都没做,虽然传递给 CallNextHookEx 的是修改后的lParam,但应用程序还是能接收到正确的键值。 可能是我从整体设计上就出了问题,请教高手。
不过这个程序最终什么都没做,虽然传递给 CallNextHookEx 的是修改后的lParam,但应用程序还是能接收到正确的键值。 可能是我从整体设计上就出了问题,请教高手。
我把HHOOK句柄 hhkKey 放到一个共享内存段中供多个DLL共享(我这么做是防止出现重复的钩子)。dll有两个导出函数,StartHook() 和 EndHook(),StartHook中执行:hhkKey = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstance, NULL);EndHook() 中执行
UnhookWindowsHookEx(hhkKey); 我用一个基于对话框的MFC程序作为界面,设定了一个CheckBox,选中时调用 StartHook(),取消选择时调用 EndHook()。经测试,UnhookWindowsHookEx(hhkKey) 总是返回一个NULL值,根据MSDN上的资料意即失败。
#define WH_KEYBOARD_LL 13
#define WH_MOUSE_LL 14
#endif // (_WIN32_WINNT >= 0x0400)你直接把那个参数填为13也可以
// Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0400
// Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif
看你的全局共享数据段是否正确设置,需要rws属性
HHOOK hhkKey = NULL;
#pragma data_seg()然后在链接设置中增加:/section:shared,rws我最关心的是第三小问,可没人回答我。 :<
钩的位置不同,WH_KEYBOARD_LL 要比WH_KEYBOARD 先触发,WH_KEYBOARD_LL 是由系统调用你的回调函数,而WH_KEYBOARD则是你钩的进程来调用你的回调函数。这就意味着,WH_KEYBOARD要插入进程,如果是全局钩子,就会插入每一个进程,WH_KEYBOARD_LL 不需要插入进程(所以据说根本不需要放在dll里面,放在exe里面也能运行)
在stdafx.h中加上一句#define _WIN32_WINNT 0x5000即可3、我试图通过修改lParam的值实现过滤键,但不管用? 当我的钩子(WH_KEYBOARD类型的HHOOK)钩到键盘消息时,我把消息的lParam参数的16到23位(资料上写这8位是键盘的扫描码)修改成某一个值,比如0x1E,即键盘上的a,然后把新的lParam作为参数传递给 CallNextHookEx 。我的想法就是不管用户按了什么键,经过我的钩子后都相当于在按“a”键。在调试过程中确认了lParam的16~23位被修改了。
不过这个程序最终什么都没做,虽然传递给 CallNextHookEx 的是修改后的lParam,但应用程序还是能接收到正确的键值。lParam是一个指针啊,不要修改lParam的值,而是修改它所指向的KBDLLHOOKSTRUCT里面的值啊
你试试修改wParam应该可以了
检测到我要的键,如果是按下,发一个按下的消息(用keybd_event)
如果是抬起,发一个抬起的消息(用keybd_event)
然后return TRUE终止消息继续传递
我是改变lParam指向的KBDLLHOOKSTRUCT中的内容后返回CallNextHookEx()。