Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何确定应用程序运行在哪个屏幕/监视器上?_Windows_Delphi_Delphi 2007_Multiscreen - Fatal编程技术网

Windows 如何确定应用程序运行在哪个屏幕/监视器上?

Windows 如何确定应用程序运行在哪个屏幕/监视器上?,windows,delphi,delphi-2007,multiscreen,Windows,Delphi,Delphi 2007,Multiscreen,在多屏幕系统中,我希望我的一些应用程序能够记住上次运行的屏幕,并再次在同一屏幕上运行 我如何确定当前屏幕/监视器是什么,记住屏幕可能具有不同的分辨率?这些程序是用Delphi 2007编写的。您可以使用该方法获取任何形式的当前监视器。该方法将返回一个包含您需要的所有信息的类 uses MultiMon; ... ... ... var LMonitor : TMonitor; LMonitorInfo : TMonitorInfoEx; begin ZeroMemory(@LMon

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


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

您可以使用该方法获取任何形式的当前监视器。该方法将返回一个包含您需要的所有信息的类

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;

VCL公开这些信息,例如通过表单的属性。这是一种公开监视器的各种属性的类型:其编号、是否为主监视器、其边界和工作矩形等

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

  • 当应用程序关闭时,记住它的边界rect
  • 当应用程序启动时,将其边界rect设置为记住的值
  • 检查表单是否包含在屏幕的bounds rect中。如果表单不在屏幕上,则用户可能已删除监视器或以其他方式重新安排了屏幕。将窗体移动到最近的监视器或主监视器上
  • 如果窗口可以最大化,则需要额外的细微差别。在这种情况下,记住bounds rect以及应用程序是否最大化。您的好友是
    GetWindowPlacement
    SetWindowPlacement

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


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

    不要忘记应用程序可以在多个屏幕上运行。在过去,我简单地捕获了应用程序的位置和大小,以及它是否在最大限度地运行——在应用程序启动时,只需恢复大小和位置。当然,在应用程序启动时,您需要查看结果是否会显示在屏幕上,以便它们是否在不再连接的屏幕上运行,以避免从当前桌面启动应用程序。我也完全按照Gary所做的做。不需要记住你的窗口在哪个监视器上,记住它在哪里。考虑使用GET/StWistWoWoLoad。这就解决了这些问题。我认为Get/SetWindowPlacement是一个不错的选择,因为它已经处理了bullet#3。