WM_SYSCOMMAND SC_MOVE eats up mouse events and mou

2019-09-16 01:13发布

My program is a chromeless window and I want to move the window when user drag any part of my dialog. Once WM_SYSCOMMAND is used, all subsequent mouse events are lost.

First I wrote a program to capture the mouse events and all working fine with 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;
}

Then I change onMouseDown above to,

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

The drag is working and the windows move along with the mouse. However, OnMouseUp event is no longer fired.

Tried many different approach using WM_NCHITTEST, or ProcessMessage setHandled to true/false without success.

Much appreciate if anyone has any suggestions :)

2条回答
Viruses.
2楼-- · 2019-09-16 01:56

The DefWindowProc handler for WM_SYSCOMMAND will be eating the mouse button up message which is why you don't see it. However, your SendMessage call won't actually return until the drag has finished so you can take that as being notification of mouse button up.

查看更多
我命由我不由天
3楼-- · 2019-09-16 02:00

Thanks for describing why you're doing this, because there's a much better approach: Return HTCAPTION in response to WM_NCHITTEST.

查看更多
登录 后发表回答