WM_SYSCOMMAND SC_MOVE会占用鼠标事件,并且不会触发鼠标

时间:2012-08-16 00:51:58

标签: c++ windows atl wtl

我的程序是一个无边框窗口,我想在用户拖动对话框的任何部分时移动窗口。使用WM_SYSCOMMAND后,所有后续鼠标事件都将丢失。

首先,我编写了一个程序来捕获鼠标事件,并且所有工作都可以正常使用WTL。

BEGIN_MSG_MAP(CMainDlg)
    MSG_WM_LBUTTONUP(OnMouseUp)
    MSG_WM_LBUTTONDOWN(OnMouseDown)
....
LRESULT OnMouseDown ( UINT uKeys, CPoint pt ) {
    print ("on mouse down");
    return 0;
}
LRESULT OnMouseUp ( UINT uKeys, CPoint pt ) {
    print ("on mouse up");
    return 0;
}

然后我将上面的onMouseDown更改为,

LRESULT OnMouseDown ( UINT uKeys, CPoint pt ) {
    print ("on mouse down");
    this->SendMessageW(WM_SYSCOMMAND, SC_MOVE|0x0002);
    return 0;
}

拖动工作正常,窗口随鼠标移动。但是,OnMouseUp事件不再被触发。

使用WM_NCHITTEST尝试了许多不同的方法,或者将ProcessMessage setHandled设置为true / false但没有成功。

如果有人有任何建议,我们非常感激:)

2 个答案:

答案 0 :(得分:6)

感谢您解释为什么要这样做,因为有更好的方法:Return HTCAPTION in response to WM_NCHITTEST

答案 1 :(得分:0)

WM_SYSCOMMAND的DefWindowProc处理程序将使用鼠标按钮消息,这就是您没有看到它的原因。但是,在拖动完成之前,您的SendMessage调用实际上不会返回,因此您可以将其视为鼠标按钮的通知。