如何最大化表格到桌面大小?

How to maximize form to desktop size?

在 Delphi 10.4.2 Win32 VCL 应用程序 运行 上 Windows 10,在双显示器设置中,当我设置我的 MainForm(或任何其他辅助窗体)时通过设置 WindowState := wsMaximized 开始最大化,然后表单仅在主监视器上最大化。

如何将表单最大化到整个桌面,以将表单大小设置为包括两个显示器?是否有 TForm class 的内置方法来实现此目的?

这不是 Windows 应用程序的标准行为。另请注意,由于桌面可以有多个不需要对齐的显示器,因此桌面可能不是矩形 - 这意味着桌面的边界矩形可能包含不可见的部分。

如果你想这样做你可以使用Windows函数GetDesktopWindow获取桌面window,然后获取它的大小,然后将窗体的大小设置为那个。

procedure TMyForm.GoLarge();
var
  rctDesktop:   TRect;
  hDT:          HWND;
begin
  hDT:=GetDesktopWindow();
  if(hDT<>0) then
  begin
    GetWindowRect(hDT, rctDesktop);
    Self.SetBounds(rctDesktop.Left,  rctDesktop.Top, rctDesktop.Width, rctDesktop.Height);
  end;
end;

这不允许任务栏或任何其他使用某些桌面的东西 space。

总的来说,这个问题并没有你想象的那么简单。我想您正在想象这样的桌面:

在这种情况下,我假设您希望 window 像这样放置:

但是,如果用户有这种布局怎么办:

你要吗

(整个 window 可见,但部分屏幕 space 未使用)或

(没有未使用的space,但window的某些部分不可见)?

如果您想使用完整的虚拟桌面space——最后一种情况——虽然很简单:

BoundsRect := Screen.DesktopRect;

这将在一个简单的设置中完成预期的事情,并且“没有未使用的 space,但 window 的某些部分可能不可见”一般来说。

另请注意,Windows 不喜欢 windows 这样的行为,因此用户可能无法获得良好的应用体验。

一般情况下,不要这样做。


请注意,即使是双显示器设置(其中两台显示器都是横向的)也可能很重要:

即使两个显示器的尺寸相同,几何形状也可能很重要:

根据 MSDN:

Positioning Objects on Multiple Display Monitors

A window or menu that is on more than one monitor causes visual disruption for a viewer. To minimize this problem, the system displays menus and new and maximized windows on one monitor.

因此,如果您希望 TForm window 延伸到整个桌面,使用 WindowState=wsMaximize 不是正确的方法,因为它只适用于 single monitor 表单主要显示在其中。

要按照你的要求去做,你必须得到Virtual Screen from GetSystemMetrics() (or Vcl.Forms.TScreen)的矩形,然后设置Form的Left/Top/Width/ Height相应地,例如:

if Screen.MonitorCount > 1 then
begin
  Form.WindowState := wsNormal;
  Form.Left := Screen.DesktopLeft;
  Form.Top := Screen.DesktopTop;
  Form.Width := Screen.DesktopWidth;
  Form.Height := Screen.DesktopHeight;
  // or:
  Form.SetBounds(Screen.DesktopLeft, Screen.DesktopTop, Screen.DesktopWidth, Screen.DesktopHeight);
  // or:
  Form.BoundsRect := Screen.DesktopRect;
end else
begin
  Form.WindowState := wsMaximized;
end;