问题描述:
1 我建了个MyStyleLict,继承自CClitCtrl
2 在父窗口的DoDataExchange关联了一个List资源,DDX_Control(pDX,IDC_LIST,m_list);需求:
如果鼠标在这个List的范围外单击鼠标左键,list能收到这个消息么?
如果能,该如何做到?

解决方案 »

  1.   

    在List范围里按下鼠标的时候SetCapture,在范围外就可以收到消息了,释放鼠标ReleaseCapture函数
      

  2.   

    SetCapture只能一个List用,不能满足我的需求HOOK如何操作?我只知道是钩子,还没用过请问能不能给出具体的1,2,3,4这样的步骤
      

  3.   

    HOOK怎么操作,看MSDN-《Using Hooks》
      

  4.   

    1.安装hook:
    HHOOK SetWindowsHookEx(
      int idHook,        // hook type
      HOOKPROC lpfn,     // hook procedure
      HINSTANCE hMod,    // handle to application instance
      DWORD dwThreadId   // thread identifier
    );
    你只想监视鼠标消息,idHook可以为WH_MOUSE,这种类型的hook回调函数可以在程序中直接定义也可以放到另外一个DLL中,你只想响应这个程序中的List 之外的的鼠标消息,那放在程序中就行了。返回的hook句柄最好放到全局变量中方便在回调函数中使用。
    2.定义hook回调函数:
    LRESULT CALLBACK MouseProc(
      int nCode,      // hook code
      WPARAM wParam,  // message identifier
      LPARAM lParam   // mouse coordinates
    );
    因为你只对鼠标的动作感兴趣函数里可以这样
    if(nCode <0 || nCode == HC_ACTION)
        return CallNextHookEx(hhook, nCode, wParam, lParam);
    wParam就有鼠标消息的类型,你按照需要使用
    lParam中有主窗口的句柄,你可以把收到的消息发送给主窗口让主窗口处理
    3.自定义一个消息响应hook发送来的消息:
    对list的操作可以都在这个消息响应函数中完成。