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

时间:2010-03-09 01:59:53

标签: c++ winapi window drag window-position

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

我想以导致任何口吃的方式做到这一点。处理WM_MOVE消息并调用MoveWindow()以重新定位窗口,如果它停止工作,但我不喜欢MoveWindow()引起的闪烁效果。

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

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

4 个答案:

答案 0 :(得分:3)

Windows最终通过SetWindowPos API定位。

SetWindowPos首先通过发送正在调整大小的窗口或移动WM_WINDOWPOSCHANGING消息来验证其参数,然后通过WM_WINDOWPOSCHANGED消息通知窗口proc更改了大小和/或位置。

DefWindowProc对这些邮件的处理反过来会发送WM_GETMINMAXINFO,然后发送WM_SIZEWM_MOVE条消息。

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

答案 1 :(得分:2)

请注意,具有多显示器设置的用户可能会将桌面扩展为负x和y坐标,或者不是矩形。此外,一些用户使用替代窗口管理器,例如LiteStep,它通过将它们移出屏幕来实现虚拟桌面;如果你试图解决这个问题,你的应用程序将会破坏这些用户。

答案 2 :(得分:0)

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

  

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

您可能还想处理WM_ENTERSIZEMOVE以了解窗口何时开始移动,WM_EXITSIZEMOVE

答案 3 :(得分:0)

WM_GETMINMAXINFO是你似乎在寻找的东西。