2015-06-29 18 views
0

在多屏幕系統上,我想讓我的一些應用程序記住它們上次運行的屏幕,並再次在同一屏幕上運行。如何確定應用程序正在運行的屏幕/監視器?

如何確定當前屏幕/顯示器是什麼,請記住屏幕可能具有不同的分辨率?這些程序是用Delphi 2007編寫的。

+3

不要忘記,應用程序可以在多個屏幕上運行。在過去,我簡單地捕獲了應用程序的位置和大小,以及它是否運行最大 - 在應用程序啓動時,只需恢復大小和位置即可。當然,在應用程序啓動時,您需要查看結果是否在屏幕上,以便它們在不再附加的屏幕上運行時避免從當前桌面啓動應用程序。 –

+0

我也做了Gary的工作。不需要記住你的窗口在哪個監視器上,記住它在哪裏。 –

+1

考慮使用Get/SetWindowPlacement。這照顧了這樣的問題。 –

回答

6

的VCL公開這一信息,例如通過窗體的Monitor財產。這是TMonitor的類型,它顯示了監視器的各種屬性:它的編號,是否是主監視器,它的邊界和工作矩陣等等。

你正在嘗試做的事情只是簡單地將表單恢復到之前運行的位置。我不認爲你需要記住顯示器信息。只需執行以下操作:

  1. 當應用程序關閉時記住它的邊界rect。
  2. 當應用程序啓動時,將其邊界設置爲記住的值。
  3. 檢查表單是否包含在屏幕的邊界矩形內。如果表單不在屏幕上,那麼用戶很可能已經移除了監視器或重新排列了他們的屏幕。將表格移到最近的顯示器或主顯示器上。
  4. 如果窗口可以最大化,需要額外的細微差別。在這種情況下,請記住邊界矩形和應用程序是否最大化。你的朋友是GetWindowPlacementSetWindowPlacement
+0

我認爲Get/SetWindowPlacement是要走的路,因爲它已經處理子彈#3。 –

3

您可以使用Screen.MonitorFromWindow方法獲得任何形式的當前監視器,這將返回一個TMonitor類,包含您需要的所有信息。

uses 
    MultiMon; 

... 
... 
... 
var 
LMonitor : TMonitor; 
LMonitorInfo : TMonitorInfoEx; 
begin 
    ZeroMemory(@LMonitorInfo, SizeOf(LMonitorInfo)); 
    LMonitorInfo.cbSize := SizeOf(LMonitorInfo); 
    LMonitor:=Screen.MonitorFromWindow(Self.Handle); //pass the handle of the form 
    if not GetMonitorInfo(LMonitor.Handle, @LMonitorInfo) then 
    RaiseLastOSError; 
    ShowMessage(Format('The form is in the monitor Index %d - %s', [LMonitor.MonitorNum, LMonitorInfo.szDevice])); 
end; 
0

大衛是正確的,我不需要顯示器信息做我想做的事情。僅用於文檔。 DeskTopWidthDeskTopHeight給出桌面大小。

我現在在家只有兩個相同分辨率的屏幕。看看工作中發生了什麼,我有4個屏幕,其中1個是不同的分辨率,這將是有趣的。如果這不起作用,那麼我可能不得不查看Monitor信息。如果有人想知道爲什麼分辨率不同,第四個是投影機。

相關問題