我有一个DLL程序,在该程序中有一个钩键盘的HOOK函数。该函数定义如下
LRESULT DllExport   CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
我在可以在工程设置->Debug->Executable for Debug session中加入了掉用该函数的可执行程序。然后在该函数内部设置断点,并且在同在这个DLL中的一个函数BOOL DllExport  installhook()中设置断点。调试时,installhook()这个函数中的断点会中断,但是键盘钩子函数中的断点就不会中断。实验证明键盘钩子函数已经正确运行,请问我如何才能调试到HOOK函数中的内容?

解决方案 »

  1.   

    如果不行就TRACE吧,从理论上想觉得hook不中断很正常
      

  2.   

    真地就没有别的办法了吗?可是我把钩子程序写到主程序中,不写到DLL中来掉用时就能够中断。我想应该是有办法的吧?
      

  3.   

    试试看加入如下代码:
    __asm
    {
       int 3;
    }
      

  4.   

    真地就没有别的办法了吗?可是我把钩子程序写到主程序中,不写到DLL中来掉用时就能够中断。我想应该是有办法的吧?那为什么写到程序中只能勾到自己的,写到dll里面就可以勾到系统的呢个人感觉不可行,不过楼上的暴力方法你可以试试:)
      

  5.   

    用IDE调试程序的时候,被调试的程序要能够完全被IDE控制,所以调试DLL的时候需要你指定一个应用程序exe来加载并使用DLL,这样IDE会启动一个exe进程,这样调试器就可以控制这个进程所有事件,函数调用等等。这样exe如果调用DLL里的函数就会被调试器捕获到,但是如果你使用了键盘钩子(设置了全局的钩子或者是别的进程的钩子),这样一来,触发钩子函数的就不再是被调试器控制的exe进程,而是其它进程了,这样它也就无法调试。但是如果你设置的全局键盘钩子,而且在你设置的exe应用程序里面按键,就会在钩子函数中中断。
        另外的方法:(个人使用的方法,不知道还有没有更好的方法  ^_^)
        或者这样,你在setting->Debug->Executable for Debug session里面设置你想要拦截键盘消息的应用程序,比如记事本,然后用你自己的应用程序安装钩子(单独运行,不需要在IDE中运行),接着在IDE中设置断点,F5启动程序开始测试(在被打开的记事本里按键也会被拦截到的)。这样也可以进行调试,不过只能调试被你指定的程序
      

  6.   

    前面一段只是个人猜测,不知道对不对     ;(
    后面的方法中,在setting->Debug->Executable for Debug session设置的应用程序一定是要能被你设置的钩子拦截的程序,全局的钩子可以随便找一个GUI程序,如果是指定了dwThreadId的钩子,一定要注意设置钩子时的Id和这里的应用程序是对应的。
      

  7.   

    hyamw(林锋)果然是高手呀,第一段我想你猜得挺对的,反正我觉得说得挺有道理的。可能因为钩子是被系统调起的吧。所以无法中断。
    第二段的调试方法真的很巧妙。而且是我对钩子的原理有了更深的体会。非常感谢!
    看来我真的还有很长的路要走,要有很多的东西要学呀!