本帖最后由 VisualEleven 于 2012-11-02 16:22:41 编辑

解决方案 »

  1.   


    LRESULT CALLBACK MsgHook(int nCode, WPARAM wParam, LPARAM lParam)
    {
    LPMSG msg = (LPMSG)lParam; if(nCode >= HC_ACTION)
    {
    switch(msg->message)
    {
    case WM_LBUTTONDOWN:
    OutputDebugString(_T("WM_LBUTTONDOWN msg monitored\n"));
    break;
    }
    } return CallNextHookEx(g_hHook, nCode, wParam, lParam);
    }g_hHook = SetWindowsHookEx(idHook, MsgHook, g_Instanse, 0);
      

  2.   

    还有个问题   就是你写给我的这个钩子中nCode >= HC_ACTION这一段我不能理解   为什么要用>=这个符号  虽然nCode是个int  但我不知道如果有HC_ACTION: nCode就一定大于或等于HC_ACTION吗  我想知道下细节能解释下吗?
      

  3.   

    上面的HOOK我给你发的代码是从我的代码里复制的,里面那个idHook变量需要改一下。g_hHook = SetWindowsHookEx(idHook, MsgHook, g_Instanse, 0);这里面的idHook用WH_CALLWNDPROC;请看WH_CALLWNDPROC中的MSDN说明:
    nCode [in] 
    Type: intSpecifies whether the hook procedure must process the message. If nCode is HC_ACTION, the hook procedure must process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and must return the value returned by CallNextHookEx. MSDN上说明了,nCode在小于0的时候你无法处理这些消息,你只能处理大于等于零的消息。
      

  4.   

    VC技术资料下载集合(长期更新)
    http://bbs.sysdn.com/forum-77-1.html
    VC技术交流群:34097777
      

  5.   

    最近也在整这个。也是鼠标钩子卸载不了。提供一个参考:
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
    改为 return NULL;
    我个人认为是,调用CallNextHookEx(g_hHook, nCode, wParam, lParam);之后,原来的钩子变得无效了,导致卸载不成功,我是这样解决的。
    另外有人提出不能在回调函数里卸载钩子,我不知道是不是,因为我之前在回调函数里卸载成功过。
      

  6.   

    先调用UnhookWindowsHookEx(g_hMouse);再调用MessageBox。我估计是因为消息框弹出来以后没有按确定,并不会执行到卸载钩子那个函数。
      

  7.   


    一样的  我看了下百度即使是在UnhookWindowsHookEx返回之后,钩子程序还可以其他线程调用。如果钩子程序没有同时被调用,钩子程序将会在UnhookWindowsHookEx返回之前删除。
    可能是这个原因    我可以在局部卸掉但如果我没在调用程序的窗口上点击的话   还是一样的
      

  8.   

    看了一下MSDN里面的说明:
    The hook procedure can be in the state of being called by another thread even after UnhookWindowsHookEx returns. If the hook procedure is not being called concurrently, the hook procedure is removed immediately before UnhookWindowsHookEx returns.大体意思是如果另外一个线程正在使用该钩子,即使调用UnhookWindowsHookEx卸载了该钩子,它还是可以被这个线程继续调用的;
    如果钩子在使用UnhookWindowsHookEx卸载的时候没有被调用,那么它可以在UnhookWindowsHookEx返回前被立即释放掉。楼主这样的设计思路是没办法规避的,只能另辟蹊径了。