我想允许用户仅在桌面的工作区域内拖动我的Win32窗口。换句话说,它们不应该让窗口的任何部分延伸到监视器之外,窗口也不应该与任务栏重叠。
我想以导致任何口吃的方式做到这一点。处理WM_MOVE消息并调用MoveWindow()以重新定位窗口,如果它停止工作,但我不喜欢MoveWindow()引起的闪烁效果。
我也尝试过处理WM_MOVING,这可以防止在移动实际发生之前通过改变目标矩形来调用MoveWindow()。这解决了闪烁问题,但我遇到的另一个问题是,当发生拖动时光标有时会离开窗口,允许用户在光标甚至不在窗口内时拖动窗口。
如何在不遇到这些问题的情况下约束我的窗口?
答案 0 :(得分:3)
Windows最终通过SetWindowPos API定位。
SetWindowPos首先通过发送正在调整大小的窗口或移动WM_WINDOWPOSCHANGING消息来验证其参数,然后通过WM_WINDOWPOSCHANGED消息通知窗口proc更改了大小和/或位置。
DefWindowProc
对这些邮件的处理反过来会发送WM_GETMINMAXINFO
,然后发送WM_SIZE
或WM_MOVE
条消息。
无论如何,处理WM_WINDOWPOSCHANGING
来过滤基于用户和代码的尝试来定位窗口越界。
答案 1 :(得分:2)
请注意,具有多显示器设置的用户可能会将桌面扩展为负x和y坐标,或者不是矩形。此外,一些用户使用替代窗口管理器,例如LiteStep,它通过将它们移出屏幕来实现虚拟桌面;如果你试图解决这个问题,你的应用程序将会破坏这些用户。
答案 2 :(得分:0)
您可以通过处理WM_MOVING消息并更改lParam指向的RECT来执行此操作。
lParam:在屏幕坐标中指向具有窗口当前位置的RECT结构。要更改拖动矩形的位置,应用程序必须更改此结构的成员。
您可能还想处理WM_ENTERSIZEMOVE以了解窗口何时开始移动,WM_EXITSIZEMOVE
答案 3 :(得分:0)
WM_GETMINMAXINFO
是你似乎在寻找的东西。