C++ 将窗口位置约束到桌面工作区

C++ 将窗口位置约束到桌面工作区,c++,winapi,window,drag,window-position,C++,Winapi,Window,Drag,Window Position,我希望允许用户仅在桌面的工作区域内拖动我的Win32窗口。换句话说,他们不应该让窗口的任何部分延伸到显示器之外,也不应该让窗口与任务栏重叠 我想用一种不会引起口吃的方式来做。处理WM_MOVE消息并在窗口关闭时调用MoveWindow()重新定位窗口是可行的,但我不喜欢MoveWindow()引起的闪烁效果 我还尝试处理WM_MOVING,它通过在实际移动之前更改目标矩形来防止调用MoveWindow()。这解决了闪烁问题,但我遇到的另一个问题是,当发生拖动时,光标有时会从窗口中逃走,从而允许用

我希望允许用户仅在桌面的工作区域内拖动我的Win32窗口。换句话说,他们不应该让窗口的任何部分延伸到显示器之外,也不应该让窗口与任务栏重叠

我想用一种不会引起口吃的方式来做。处理WM_MOVE消息并在窗口关闭时调用MoveWindow()重新定位窗口是可行的,但我不喜欢MoveWindow()引起的闪烁效果

我还尝试处理WM_MOVING,它通过在实际移动之前更改目标矩形来防止调用MoveWindow()。这解决了闪烁问题,但我遇到的另一个问题是,当发生拖动时,光标有时会从窗口中逃走,从而允许用户在光标不在窗口内时拖动窗口


如何在不遇到这些问题的情况下约束窗口?

您可以通过处理消息和更改LPRAM指向的RECT来做到这一点

lParam:指向具有窗口当前位置的RECT结构的指针,以屏幕坐标表示。若要更改拖动矩形的位置,应用程序必须更改此结构的成员


您可能还想知道窗口何时开始移动,并且您似乎正在寻找的是
WM_EXITSIZEMOVE
WM_GETMINMAXINFO

窗口最终是通过API定位的

SetWindowPos首先通过向正在调整大小或移动的窗口发送一条消息来验证其参数,然后发送一条消息,通知窗口进程已更改的大小和/或位置

DefWindowProc
这些消息的处理依次发送
WM\u GETMINMAXINFO
,然后发送
WM\u SIZE
WM\u MOVE
消息


无论如何,处理
WM_WINDOWPOSCHANGING
以过滤用户和基于代码的尝试,将窗口定位到边界之外。

请记住,具有多监视器设置的用户可能有一个扩展到负x和y坐标的桌面,或者不是矩形的桌面。此外,一些用户使用替代窗口管理器,如LiteStep,它通过将虚拟桌面移出屏幕来实现虚拟桌面;如果您试图与此抗争,您的应用程序将为这些用户而崩溃