WM_SYSCOMMAND SC_MOVE eats up mouse events and mouse up is not fired
Asked Answered
R

2

1

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 :)

Rimini answered 16/8, 2012 at 0:51 Comment(1)
WM_NCHITTEST is the appropriate solution. You didn't post the code you tried, so I can't tell what might be wrong with it.Relentless
E
6

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

Esch answered 16/8, 2012 at 11:31 Comment(0)
S
0

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.

Skysweeper answered 16/8, 2012 at 3:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.