我有一个DLL程序,在该程序中有一个钩键盘的HOOK函数。该函数定义如下
LRESULT DllExport CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
我在可以在工程设置->Debug->Executable for Debug session中加入了掉用该函数的可执行程序。然后在该函数内部设置断点,并且在同在这个DLL中的一个函数BOOL DllExport installhook()中设置断点。调试时,installhook()这个函数中的断点会中断,但是键盘钩子函数中的断点就不会中断。实验证明键盘钩子函数已经正确运行,请问我如何才能调试到HOOK函数中的内容?
LRESULT DllExport CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
我在可以在工程设置->Debug->Executable for Debug session中加入了掉用该函数的可执行程序。然后在该函数内部设置断点,并且在同在这个DLL中的一个函数BOOL DllExport installhook()中设置断点。调试时,installhook()这个函数中的断点会中断,但是键盘钩子函数中的断点就不会中断。实验证明键盘钩子函数已经正确运行,请问我如何才能调试到HOOK函数中的内容?
__asm
{
int 3;
}
另外的方法:(个人使用的方法,不知道还有没有更好的方法 ^_^)
或者这样,你在setting->Debug->Executable for Debug session里面设置你想要拦截键盘消息的应用程序,比如记事本,然后用你自己的应用程序安装钩子(单独运行,不需要在IDE中运行),接着在IDE中设置断点,F5启动程序开始测试(在被打开的记事本里按键也会被拦截到的)。这样也可以进行调试,不过只能调试被你指定的程序
后面的方法中,在setting->Debug->Executable for Debug session设置的应用程序一定是要能被你设置的钩子拦截的程序,全局的钩子可以随便找一个GUI程序,如果是指定了dwThreadId的钩子,一定要注意设置钩子时的Id和这里的应用程序是对应的。
第二段的调试方法真的很巧妙。而且是我对钩子的原理有了更深的体会。非常感谢!
看来我真的还有很长的路要走,要有很多的东西要学呀!