共用方式為


將物件放置在多個顯示器監視器上

在多個監視器上的視窗或功能表會導致檢視者的視覺中斷。 為了將這個問題降到最低,系統會在一部監視器上顯示功能表和新的和最大化視窗。 下表顯示如何選擇監視器。

Object 位置
時間範圍 CreateWindow (Ex) 會在包含視窗最大部分的監視器上顯示視窗。在最小化之前,在包含視窗最大部分的監視器上最大化。
ALT-TAB 按鍵組合會在具有目前使用中視窗的監視器上顯示視窗。
擁有的視窗 在與其擁有者相同的監視器上。
出現在包含對應功能表項目最大部分的監視器上。
內容功能表 出現在發生滑鼠右鍵的監視器上。
下拉式清單 出現在包含下拉式方塊矩形的監視器上。
對話方塊 出現在擁有它的視窗監視器上。如果使用DS_CENTERMOUSE樣式定義,則會以滑鼠出現在監視器上。
如果它沒有擁有者,而且對話方塊位於相同的應用程式中,對話方塊會出現在目前使用中視窗的監視器上。
如果對話方塊沒有擁有者,而且使用中視窗不在與對話方塊相同的應用程式中,對話方塊會出現在主要監視器上。
訊息方塊 出現在擁有它的視窗監視器上。

 

如果視窗跨越兩個監視器,而其中一個監視器已重新置放,則系統會將視窗放在包含原始視窗最大部分的監視器上。

應用程式通常需要放置物件。 例如,可能需要在與另一個視窗相同的監視器上建立視窗。

將物件放在多個監視系統上

  1. 判斷適當的監視器。
  2. 取得監視器的座標。
  3. 使用座標放置 物件。

一般而言,您會將物件放在主要監視器上,或位於已經有物件的監視器上。 若要識別指定點、矩形或視窗的監視器,請使用 MonitorFromPointMonitorFromRectMonitorFromWindow

若要取得監視器的座標,請使用 GetMonitorInfo,其同時提供工作區和整個監視器矩形。 請注意,SM_CXSCREEN和SM_CYSCREEN一律參考主要監視器,不一定是顯示應用程式的監視器。 此外,請避免SM_xxVIRTUALSCREEN,因為這會將您的視窗置中虛擬畫面,而不是監視器。

若要將對話方塊置中視窗的工作區域,請使用DS_CENTER樣式。 若要將對話方塊置中至應用程式視窗,請使用 GetWindowRect。 Windows 會自動將功能表和對話方塊限制為監視器。 不過,自訂功能表、自訂下拉式方塊、自訂工具選擇區,以及已儲存的應用程式位置可能會發生問題。

如需如何正確定位物件的範例,請參閱 在多個顯示設定上放置物件

使用 SM_CXSCREEN 和 SM_CYSCREEN 來判斷應用程式桌面工具列的位置, (也稱為 appbar) 會將 appbar 限制為主要監視器。 若要允許 appbar 位於任何監視器的任何邊緣,請使用適當的系統計量來計算監視器的邊緣。 此外,使用 GET_X_LPARAMGET_Y_LPARAM 宏來擷取座標,否則座標的正負號可能會錯誤。 這些宏包含在 Windowsx.h 中。

全螢幕視窗的大小需要在不同解析度的監視器之間移動時變更。 若要這樣做,應用程式必須使用 MonitorFromWindowMonitorFromPoint 檢查其開啟的視窗,然後使用 GetMonitorInfo 來取得監視器的大小。 或者,您可以使用 DirectX DirectDrawEnumerateEx函式中的HMONITOR。 然後使用 SetWindowPos 來錨定視窗並調整其大小,以涵蓋監視器。

最大化的視窗未涵蓋具有 「Always on top」 屬性的工作列。 不過,全螢幕視窗涵蓋工作列,例如,在 Microsoft PowerPoint 投影片放映和遊戲中。

若要儲存及稍後還原,應用程式結束時視窗的位置,請使用 GetWindowPlacementSetWindowPlacement 函式。 不過,請檢查位置在使用之前是否仍然有效,因為監視可能已經從系統移動或移除。 如果視窗的 HMONITOR 無效,應用程式就會在主要監視器上顯示視窗。

系統會嘗試在包含其快捷方式的監視器上啟動應用程式。 因此,放置應用程式的其中一種方式是在想要的監視器上擁有其快捷方式。

如果您使用 ShellExecuteShellExecuteEx ,請提供 hWnd ,讓系統會在與呼叫應用程式相同的監視器上開啟任何新的視窗。

請注意,具有多個監視器的系統會稍微改變 MINMAXINFO 結構的值。