我在OnTimer函数里用SetCapture函数捕获鼠标消息,用的是GetMessage();当按下鼠标左键时,调用killTimer()和ReleaseCapture().一般情况下运行良好的,但有的时候按下鼠标左键却没有反应,哪位能帮忙解答一下不,不甚感激!!!

解决方案 »

  1.   

    OnTimer是有定时循环功能的,可能在获取消息的时候并没有鼠标按下的操作,而按下时又不在OnTimer里。
    最好是让程序自己处理这个消息,在获取后激活OnTimer。
      

  2.   

    因为我要捕捉对话框外的鼠标事件,所以是在点击对话框上的按钮以后再激活OnTimer来捕获鼠标消息的,不能像你说的那样做。不过原因倒有可能是你说的那样。
      

  3.   

    用HOOK捕获鼠标消息吧,给个说明:
    #pragma  once
     
    extern HHOOK hMouseHook;
    extern bool bNcLButtonDown;
     
    LRESULT CALLBACK MouseHookProc(int nCode,WPARAM wParam, LPARAM lParam);
     
     
     
     
     
    //NCButtonUpHelper.cpp
     
    #include "stdafx.h"
     
    HHOOK hMouseHook = NULL;
    bool bNcLButtonDown = false;
     
    LRESULT CALLBACK MouseHookProc(int nCode,WPARAM wParam, LPARAM lParam)
    {
     if (nCode == HC_ACTION)
     {
      PMOUSEHOOKSTRUCT mhs = (PMOUSEHOOKSTRUCT)lParam;
       CWnd   *pWnd   =   AfxGetMainWnd();
      switch (wParam)
      {
      case WM_NCLBUTTONDOWN:
       {
        if (HTCAPTION == mhs->wHitTestCode && mhs->hwnd == pWnd->GetSafeHwnd())
        {
         SendMessage(mhs->hwnd,WM_NCLBUTTONDOWN,HTCAPTION,MAKELONG(mhs->pt.x,mhs->pt.y));
         bNcLButtonDown = true;
        }
       }
       break;
      case WM_NCLBUTTONUP:
       {
        bNcLButtonDown = false;
       }
       break;
      case WM_LBUTTONUP:
       {
        if (true == bNcLButtonDown && mhs->hwnd == pWnd->GetSafeHwnd())
        {
         PostMessage(mhs->hwnd,WM_NCLBUTTONUP,HTCAPTION,MAKELONG(mhs->pt.x,mhs->pt.y));
         bNcLButtonDown = false;
        }
       }
       break;
      }
     }
     
     return CallNextHookEx(hMouseHook,nCode,wParam,lParam);
    }
     
     
     
    //例子加入,鼠标点击客户区外(对话框标题栏、非设备区)
     
    #include "NCButtonUpHelper.h"
     
    在OnInitDialog()初始化对话框里加入
     
    hMouseHook = SetWindowsHookEx(WH_MOUSE,
      (HOOKPROC)MouseHookProc,
      (HINSTANCE)AfxGetInstanceHandle(),
      AfxGetThread()->m_nThreadID);
     
     
     
    在OnDestroy()消息里添加卸载钩子
     
    if (hMouseHook != NULL)
     {
           UnhookWindowsHookEx(hMouseHook);
     }
      

  4.   

    Hook吧,SetWindowsHookEx(WH_MOUSE_LL, ...)
      

  5.   

    那请问可以将hook的回调函数写成对话框类的成员函数吗?我有试过用HOOK 的,但是调用SetWindowsHookEx的时候报错,说要函数的成员列表,没用过,所以不知道怎么解决。我是将回调函数写成了成员函数的
      

  6.   

    SetWindowsHookEx(WH_MOUSE_LL, ...)
      

  7.   

    终于解决了还是Hook好用。不过钩子的回调函数应该是不能写成成员函数,要捕捉对话框外的要用
    WH_MOUSE_LL。自己开始没有注意到这一点。