比桌面更大的窗口最大化

Posted

技术标签:

【中文标题】比桌面更大的窗口最大化【英文标题】:Maximized window larger than desktop 【发布时间】:2014-07-14 08:26:57 【问题描述】:

在一台 XP 机器上,我的表单在最大化时比桌面大。这和Delphi有关还是XP中有些设置需要调整?

编辑; 如您所见,当边框图标就位时,大约 15% 的表单被截断,并且正是它们在表单最大化时应该在的位置。没有第二个监视器。

【问题讨论】:

请提供一些细节。请参阅this question 以获取有关问题如何提供信息的示例,以便其所问的内容一目了然。您可以在访问时决定这是否与那个重复。 我已经看到了这个问题,但它对我没有帮助。通常,windows 会根据屏幕自动调整最大化的窗口,这意味着 ClientWidth 和 ClientHeight 是自动的。Window 的客户区由分辨率决定。那么为什么窗体会跳出窗口的客户区呢? 我不知道。如果有人知道可用信息,我会感到惊讶。但这是你的选择...... @SertacAkyuz 我想知道为什么会发生这种情况,有没有办法纠正它。但是,您还需要什么其他信息? 我什至不知道您是否仅使用特定形式观察到这种行为。或者你正在观察的究竟是什么。系统是否有多个显示器并且您在其他显示器上看到客户区?或者只有一台显示器但缺少内容?窗户的尺寸是多少?应该是什么?总之,我们不是你,不能和你做同样的观察。我们只知道你说了什么。 【参考方案1】:

这是因为在旧版本的 Windows(包括 XP)中,最大化的窗口已经足够大,以至于窗口边框不可见。窗口边框没有被移除,只是窗口比屏幕稍微大了一点,然后在屏幕上居中,所以边框是不可见的。

如果您有多个显示器,您可以看到这一点:根据您的 Windows 版本,如果您在一个屏幕上最大化一个窗口,您可能会看到窗口的边缘出现在另一个显示器的一侧。

这不是错误,也不是通过 Windows 设置或 Delphi 解决的问题。

这在 Vista 中已在视觉上得到解决:边框仍然存在(并且窗口大小可能会报告与屏幕大小不同的大小)但未绘制悬垂边框。

您可以在Raymond Chen's blog post about the topic 上阅读更多内容。

【讨论】:

@DavidHeffernan 我希望他/她昨天发布了所有这些信息。我为错误的问题写了一个漂亮的正确答案;) @DavidM - “所有信息” ?我猜你在开玩笑。无论如何,如果你碰巧读到了问题的前两个 cmets,那么你就会知道提问者不认为这是解决方案。 @SertacAkyuz 好吧,没有太多额外的信息;)但足以使问题不是什么更清楚,即使没有足够的信息来知道问题是什么。当我发布这篇文章时,我想我没有读过那些 cmets - 它们甚至可能还不存在。 @DavidM - 他们做到了,但没关系,您不必阅读 cmets。我想很多人不读它们。【参考方案2】:

很可能您的最终用户正在使用其中一种用于扩展桌面空间的软件。如果某些监视器和任何应用程序窗口总是根据工作区边界调整大小,这些程序的作用是扩展工作区大小。

我建议您尝试在最终用户计算机上运行此代码,以获取有关其屏幕大小、工作区大小、他使用多少个屏幕等的更多信息。

procedure CheckScreenInfo;
var I: Integer;
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Monitor count:'+IntToStr(Screen.MonitorCount));
  Memo1.Lines.Add('Form is on monitor:'+IntToStr(Form4.Monitor.MonitorNum));
  Memo1.Lines.Add('Desktop left:'+IntToStr(Screen.DesktopLeft));
  Memo1.Lines.Add('Desktop top:'+IntToStr(Screen.DesktopTop));
  Memo1.Lines.Add('Desktop width:'+IntToStr(Screen.DesktopWidth));
  Memo1.Lines.Add('Desktop height:'+IntToStr(Screen.DesktopHeight));
  Memo1.Lines.Add('Screen width:'+IntToStr(Screen.Width));
  Memo1.Lines.Add('Screen height:'+IntToStr(Screen.Height));
  Memo1.Lines.Add('Work area left:'+IntToStr(Screen.WorkAreaLeft));
  Memo1.Lines.Add('Work area top:'+IntToStr(Screen.WorkAreaTop));
  Memo1.Lines.Add('Work area width:'+IntToStr(Screen.WorkAreaWidth));
  Memo1.Lines.Add('Work area height:'+IntToStr(Screen.WorkAreaHeight));
  for I := 0 to Screen.MonitorCount -1 do
  begin
    Memo1.Lines.Add('#####-Monitor '+IntToStr(Screen.Monitors[I].MonitorNum)+'-#####');
    Memo1.Lines.Add('Monitor left:'+IntToStr(Screen.Monitors[I].Left));
    Memo1.Lines.Add('Monitor top:'+IntToStr(Screen.Monitors[I].Top));
    Memo1.Lines.Add('Monitor width:'+IntToStr(Screen.Monitors[I].Width));
    Memo1.Lines.Add('Monitor height:'+IntToStr(Screen.Monitors[I].Height));
    Memo1.Lines.Add('Monitor workarea top:'+IntToStr(Screen.Monitors[I].WorkareaRect.Top));
    Memo1.Lines.Add('Monitor workarea left:'+IntToStr(Screen.Monitors[I].WorkareaRect.Left));
    Memo1.Lines.Add('Monitor workarea width:'+IntToStr(Screen.Monitors[I].WorkareaRect.Width));
    Memo1.Lines.Add('Monitor workarea height:'+IntToStr(Screen.Monitors[I].WorkareaRect.Height));
    Memo1.Lines.Add('Monitor bounds top:'+IntToStr(Screen.Monitors[I].BoundsRect.Top));
    Memo1.Lines.Add('Monitor bounds left:'+IntToStr(Screen.Monitors[I].BoundsRect.Left));
    Memo1.Lines.Add('Monitor bounds width:'+IntToStr(Screen.Monitors[I].BoundsRect.Width));
    Memo1.Lines.Add('Monitor bounds height:'+IntToStr(Screen.Monitors[I].BoundsRect.Height));
  end;
end;

【讨论】:

【参考方案3】:

您确定屏幕偏移/尺寸正确吗?边缘可能在桌面区域之外,但并不明显。尝试进入显示器校准菜单并验证左上角/右下角偏移。

也可以将屏幕尺寸设置为大于屏幕可以处理的尺寸。

在桌面上移动时屏幕会滚动吗?

如果是这样,我认为这就是问题所在,在这种情况下,您需要调整屏幕分辨率或桌面设置。

不过,我的赌注是第一个解决方案。

【讨论】:

这是我目前无法访问的网络上的一台 PC。他们刚刚给我发送了打印屏幕。底部工具栏似乎就位,因此桌面区域设置正确。 我真的不知道你怎么能写出这个问题的答案

以上是关于比桌面更大的窗口最大化的主要内容,如果未能解决你的问题,请参考以下文章

使用 winappdriver 最大化桌面窗口无法正常工作

最大化的 MFC 对话框大于监视器

ubuntu的unity桌面不能正常显示怎么办

桌面运维之Windows快捷键,每一个工程师都是“快捷键”的工程师!

最大化 Oracle 窗口 [关闭]

win10窗口怎么调整大小