限制窗口位置到桌面工作区域

问题描述:

我想允许用户拖动我的Win32窗口只在桌面的工作区域内。换句话说,它们不应该能够让窗口的任何部分延伸到监视器之外,窗口也不应该与任务栏重叠。限制窗口位置到桌面工作区域

我想这样做会导致任何口吃。处理WM_MOVE消息并调用MoveWindow()以在窗口关闭时重新定位窗口,但我不喜欢MoveWindow()引起的闪烁效果。

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

如何限制我的窗口而不会遇到这些问题?

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

您可以通过处理WM_MOVING消息并更改lParam指向的RECT来完成此操作。

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

,你可能还需要处理WM_ENTERSIZEMOVE知道什么时候该窗口开始移动,WM_EXITSIZEMOVE

WM_GETMINMAXINFO是你仿佛在寻找。

Windows最终通过SetWindowPos API定位。

SetWindowPos通过发送窗口大小或移动一个WM_WINDOWPOSCHANGING消息,然后一个WM_WINDOWPOSCHANGED消息通知窗口过程更改大小和/或位置来验证其参数。

DefWindowProc这些消息的处理依次发送WM_GETMINMAXINFO,然后发送WM_SIZEWM_MOVEWM_MOVE消息。

无论如何,处理WM_WINDOWPOSCHANGING来过滤基于用户和代码的尝试来定位窗口超出界限。