限制窗口位置到桌面工作区域
我想允许用户拖动我的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_SIZE
或WM_MOVE
或WM_MOVE
消息。
无论如何,处理WM_WINDOWPOSCHANGING
来过滤基于用户和代码的尝试来定位窗口超出界限。