2010-03-09 74 views
3

我想允許用戶拖動我的Win32窗口只在桌面的工作區域內。換句話說,它們不應該能夠讓窗口的任何部分延伸到監視器之外,窗口也不應該與任務欄重疊。限制窗口位置到桌面工作區域

我想這樣做會導致任何口吃。處理WM_MOVE消息並調用MoveWindow()以在窗口關閉時重新定位窗口,但我不喜歡MoveWindow()引起的閃爍效果。

我也嘗試過處理WM_MOVING,它可以防止在移動實際發生之前通過改變目標矩形來調用MoveWindow()。這解決了閃爍問題,但我遇到的另一個問題是,當發生拖動時,光標有時會從窗口中離開,允許用戶拖動窗口,而光標甚至不在窗口內。

如何限制我的窗口而不會遇到這些問題?

回答

2

請記住,具有多監視器設置的用戶可能有一個桌面,該桌面可擴展到x和y座標負值,或者不是矩形。此外,一些用戶使用替代窗口管理器,如LiteStep,通過將它們移出屏幕實現虛擬桌面;如果您嘗試與此戰鬥,那麼您的應用程序將爲這些用戶中斷。

0

您可以通過處理WM_MOVING消息並更改lParam指向的RECT來完成此操作。

lParam:指向窗口當前位置的RECT結構,在屏幕座標中。要更改拖動矩形的位置,應用程序必須更改此結構的成員。

,你可能還需要處理WM_ENTERSIZEMOVE知道什麼時候該窗口開始移動,WM_EXITSIZEMOVE

0

WM_GETMINMAXINFO是你彷彿在尋找。

3

Windows最終通過SetWindowPos API定位。

SetWindowPos通過發送窗口大小或移動一個WM_WINDOWPOSCHANGING消息,然後一個WM_WINDOWPOSCHANGED消息通知窗口過程更改大小和/或位置來驗證其參數。

DefWindowProc這些消息的處理依次發送WM_GETMINMAXINFO,然後發送WM_SIZEWM_MOVEWM_MOVE消息。

無論如何,處理WM_WINDOWPOSCHANGING來過濾基於用戶和代碼的嘗試來定位窗口超出界限。