C语言 如何在窗口的非客户区检测WM_LBUTTONUP消息?

jvidinwx  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(228)

我尝试允许窗口被客户端区域拖动,并且仍然检测WM_LBUTTONUP消息进行处理。我发现了两种常用的拖动窗口的方法(如下所列),这两种方法都依赖于使用非客户端相关的函数,但是它们在释放左键按钮时无法检测WM_LBUTTONUP消息。
我尝试接收WM_LBUTTONUP消息,同时能够通过客户区拖动屏幕,在WM_LBUTTONDOWN上每毫秒发送SetTimer,并使用SetWindowPos移动光标所在的窗口,然后在WM_LBUTTONUP上发送KillTimer,它工作正常,并成功检测到WM_LBUTTONUP消息,但是,我不喜欢这个解决方案,因为窗口似乎不太顺利,因为它是拖来拖去,相比于解决方案,我发现网上。
我希望有来自非客户端的解决方案的流畅性。有没有一种方法可以使用它们来拖动窗口,并同时接收WM_LBUTTONUP消息?谢谢阅读!
在线找到的第一个非客户端方法示例:

case WM_LBUTTONDOWN:
        mouseState = 1;
        break;

    case WM_LBUTTONUP:
        mouseState = 0;
        break;

    case WM_MOUSEMOVE:
    {
        if (mouseState)
        {
            POINT CursPt;
            GetCursorPos(&CursPt);
            PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(CursPt.x, CursPt.y));
            //mouseState = 0;
        }
    }break;

在线找到的第二个非客户端方法示例:

case WM_NCHITTEST: 
    {
        LRESULT hit = DefWindowProc(hWnd, message, wParam, lParam);
        if (hit == HTCLIENT) hit = HTCAPTION;
        return hit;
    }
p3rjfoxz

p3rjfoxz1#

第一个“例子”是荒谬的,我不会使用它。
第二个“例子”可能有效,但你必须意识到,如果你使用它,你将永远不会收到WM_LBUTTONDOWN或WM_LBUTTONUP,你将只收到WM_NCLBUTTONDOWN和WM_NCLBUTTONUP。所以,你将不得不凑合着使用WM_NCLBUTTONUP,并祈祷你的窗口中没有其他东西依赖于正确的客户端鼠标事件。
另一种方法(事实证明,这不会产生好的结果,见评论中的讨论吹,)是做你自己的窗口移动:

  • 在WM_LBUTTONDOWN上开始移动
  • 在WM_LBUTTONUP上停止移动
  • 按下鼠标按钮时,在每个WM_MOUSEMOVE上使用SetWindowPos()

相关问题