【问题标题】:WM_SYSCOMMAND SC_MOVE eats up mouse events and mouse up is not firedWM_SYSCOMMAND SC_MOVE 吃掉鼠标事件并且不会触发鼠标向上
【发布时间】:2012-08-12 08:05:26
【问题描述】:

我的程序是一个无镶边窗口,当用户拖动我的对话框的任何部分时,我想移动窗口。一旦使用了 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 尝试了许多不同的方法,但均未成功。

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

【问题讨论】:

  • WM_NCHITTEST 是合适的解决方案。你没有发布你尝试过的代码,所以我不知道它可能有什么问题。

标签: c++ windows atl wtl


【解决方案1】:

感谢您描述您这样做的原因,因为有更好的方法:Return HTCAPTION in response to WM_NCHITTEST

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多