代码如下:
hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, GetModeleHandle(NULL), GetCurrentThreadId());
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
        case WM_NCLBUTTONDOWN:  
           {
           }
           break;
        case WM_LBUTTONUP:
           {
           }
           break;
        case WM_NCHITTEST:
           {
           }
           break;
        default:
           break;
         }
     }     return CallNextHookEx(hHook, nCode, wParam, lParam);
}WM_NCLBUTTONDOWN、WM_LBUTTONUP这二个消息收得到,为什么WM_NCHITTEST确收不到呢?这是啥原因,应该怎么做?

解决方案 »

  1.   

    WM_NCHITTEST
    这种消息能被Hook吗?
      

  2.   

    应该用WH_CALLWNDPROC hook类型
    WM_NCHITTEST是直接调用 消息处理过程的
      

  3.   


    能具体讲一下么?
    消息处理过程? 意思是指不能被Hook截取么?
    但我试了使用WH_CALLWNDPROC 拖动窗口标题拦时,没有收到任何鼠标消息及WM_NCHITTEST消息。
      

  4.   

    如果你是Hook自身程序的WM_NCHITTEST,你这样改一下就可以了:HHOOK m_hHook;
    WNDPROC oldProc;LRESULT CALLBACK HookWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {    
        LRESULT rc = CallWindowProc(oldProc, hWnd, uMsg, wParam, lParam );
        
        if (uMsg == WM_NCHITTEST)        
        {
            OutputDebugString("Hook到消息\n");
        }    if (uMsg == WM_NCDESTROY)        
            UnhookWindowsHookEx(m_hHook);    return rc;
    }LRESULT CALLBACK SetHook(int nCode,WPARAM wParam,LPARAM lParam)
    {
        if (nCode == HC_ACTION)//Checks if an action is beeing active
        {        CWPSTRUCT* pwp = (CWPSTRUCT*)lParam;         
            if (pwp->message == WM_INITDIALOG)                
                oldProc=(WNDPROC)SetWindowLong(pwp->hwnd,GWL_WNDPROC,(LONG)HookWndProc); 
        }
        return CallNextHookEx(m_hHook,nCode,wParam,lParam);
    }//安装钩子
    m_hHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)SetHook,NULL,GetCurrentThreadId());
      

  5.   

    谢谢, 问题已得到解决!
    不过,绑定了HookWndProc, 我想取消这个消息回调函数该怎么做。
      

  6.   

    SetWindowLong的返回值就是在绑定之前的值,即将oldProc设置回去即可。可以参照SetWindowLong的MSDN说明:
    Return Value
    If the function succeeds, the return value is the previous value of the specified 32-bit integer.