如何确定运行应用程序的屏幕/监视器?

时间:2015-06-29 03:05:58

标签: windows delphi delphi-2007 multiscreen

在多屏幕系统上,我希望我的一些应用程序能够记住它们上次运行的屏幕并再次在同一屏幕上运行。

如何确定当前屏幕/显示器是什么,请记住屏幕可能具有不同的分辨率?这些程序是用Delphi 2007编写的。

3 个答案:

答案 0 :(得分:6)

VCL公开此信息,例如通过表单Monitor属性。这是类型TMonitor,它公开了监视器的各种属性:它的编号,它是主监视器,它的边界和工作区等等。

您尝试做的只是将表单恢复到之前运行的位置。我不认为你需要记住监控信息。只需执行以下操作:

  1. 当应用程序关闭时,请记住其边界rect。
  2. 当应用程序启动时,将其bounds rect设置为记住的值。
  3. 检查表单是否包含在屏幕的界限rect中。如果表单在屏幕外,则用户可能已移除监视器或以其他方式重新排列其屏幕。将表单移动到最近的监视器或主监视器上。
  4. 如果窗口可以最大化,则需要额外的细微差别。在这种情况下,记住边界矩形以及应用程序是否最大化。您的朋友是GetWindowPlacementSetWindowPlacement

答案 1 :(得分: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;

答案 2 :(得分:0)

大卫是正确的,因为我不需要显示器信息来做我想做的事情。仅供参考。 DeskTopWidth DeskTopHeight 可提供桌面大小。

目前我在家只有两个相同分辨率的屏幕。看看在我有4个屏幕的工作中会发生什么会很有趣,其中1个屏幕具有不同的分辨率。如果这不起作用,那么我可能也必须查看监视器信息。如果有人想知道为什么分辨率不同,第4个就是投影机。