【问题标题】:How can I determine what screen/monitor the application is running on?如何确定应用程序在哪个屏幕/监视器上运行?
【发布时间】:2015-06-29 03:05:58
【问题描述】:

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

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

【问题讨论】:

  • 不要忘记应用程序可以在多个屏幕上运行。过去我简单地捕获了应用程序的位置和大小以及它是否正在运行最大——在应用程序启动时,只需恢复大小和位置。当然,在应用程序启动时,您需要查看结果是否会显示在屏幕上,以便它们是否在不再连接的屏幕上运行,以避免从当前桌面启动应用程序。
  • 我也完全按照 Gary 的做法行事。无需记住您的窗口在哪个监视器上,记住它在哪里。
  • 考虑使用 Get/SetWindowPlacement。这可以解决此类问题。

标签: windows delphi delphi-2007 multiscreen


【解决方案1】:

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

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

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

【讨论】:

  • 我认为 Get/SetWindowPlacement 是可行的方法,因为它已经处理了第 3 个项目符号。
【解决方案2】:

您可以使用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;

【讨论】:

    【解决方案3】:

    David 是正确的,因为我不需要监视器信息来做我想做的事情。仅用于文档。 DeskTopWidthDeskTopHeight 给出桌面大小。

    我现在在家,只有两个分辨率相同的屏幕。看看在我有 4 个屏幕的情况下会发生什么会很有趣,其中 1 个屏幕具有不同的分辨率。如果这不起作用,那么我可能还需要查看 Monitor 信息。如果有人想知道为什么分辨率不同,第四个是投影仪。

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多