WM_SYSCOMMAND SC_MOVE吃掉鼠标事件,并且不会触发鼠标

WM_SYSCOMMAND SC_MOVE eats up mouse events and mouse up is not fired

本文关键字:鼠标 事件 MOVE SC WM SYSCOMMAND      更新时间:2023-10-16

我的程序是一个无边框窗口,当用户拖动对话框的任何部分时,我想移动窗口。使用 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;
}

然后我把上面的鼠标向下更改为,

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

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

尝试了许多不同的方法使用WM_NCHITTEST或进程消息集处理为真/假,但没有成功。

如果有人有任何建议,非常感谢:)

感谢您描述为什么要这样做,因为有一种更好的方法:返回HTCAPTION以响应WM_NCHITTEST

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