在多屏幕系統上,我想讓我的一些應用程序記住它們上次運行的屏幕,並再次在同一屏幕上運行。如何確定應用程序正在運行的屏幕/監視器?
如何確定當前屏幕/顯示器是什麼,請記住屏幕可能具有不同的分辨率?這些程序是用Delphi 2007編寫的。
在多屏幕系統上,我想讓我的一些應用程序記住它們上次運行的屏幕,並再次在同一屏幕上運行。如何確定應用程序正在運行的屏幕/監視器?
如何確定當前屏幕/顯示器是什麼,請記住屏幕可能具有不同的分辨率?這些程序是用Delphi 2007編寫的。
的VCL公開這一信息,例如通過窗體的Monitor
財產。這是TMonitor
的類型,它顯示了監視器的各種屬性:它的編號,是否是主監視器,它的邊界和工作矩陣等等。
你正在嘗試做的事情只是簡單地將表單恢復到之前運行的位置。我不認爲你需要記住顯示器信息。只需執行以下操作:
GetWindowPlacement
和SetWindowPlacement
。我認爲Get/SetWindowPlacement是要走的路,因爲它已經處理子彈#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;
大衛是正確的,我不需要顯示器信息做我想做的事情。僅用於文檔。 DeskTopWidth和DeskTopHeight給出桌面大小。
我現在在家只有兩個相同分辨率的屏幕。看看工作中發生了什麼,我有4個屏幕,其中1個是不同的分辨率,這將是有趣的。如果這不起作用,那麼我可能不得不查看Monitor信息。如果有人想知道爲什麼分辨率不同,第四個是投影機。
不要忘記,應用程序可以在多個屏幕上運行。在過去,我簡單地捕獲了應用程序的位置和大小,以及它是否運行最大 - 在應用程序啓動時,只需恢復大小和位置即可。當然,在應用程序啓動時,您需要查看結果是否在屏幕上,以便它們在不再附加的屏幕上運行時避免從當前桌面啓動應用程序。 –
我也做了Gary的工作。不需要記住你的窗口在哪個監視器上,記住它在哪裏。 –
考慮使用Get/SetWindowPlacement。這照顧了這樣的問題。 –