You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FMX无边框窗体最大化覆盖任务栏,如何显示Windows任务栏?

解决BorderStyle=None且WindowState=wsMaximized时覆盖Windows任务栏的问题

这个问题我之前也踩过坑!当你把窗体的BorderStyle设为None后,Windows系统就不会自动帮你预留任务栏的空间了——哪怕你设置了WindowState = wsMaximized,系统也会直接让窗体填满整个屏幕,包括任务栏的区域。

解决思路很简单:手动获取系统的「工作区」范围(也就是排除任务栏、停靠工具栏后的屏幕区域),然后把窗体的大小和位置设置为这个范围。下面给你不同框架下的实现方法:

Delphi/VCL 实现

在窗体的OnCreate事件里添加这段代码:

procedure TMainForm.FormCreate(Sender: TObject);
var
  WorkArea: TRect;
begin
  // 调用Windows API获取当前主显示器的工作区
  SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
  // 将窗体的边界设置为工作区范围
  Self.BoundsRect := WorkArea;
end;

这段代码里,SPI_GETWORKAREA会返回系统当前的工作区矩形,不管任务栏在屏幕的哪个位置(底部、左侧、顶部、右侧),它都会自动排除任务栏的空间,保证窗体不会覆盖任务栏。

C# WinForms 实现

如果是用C# WinForms开发,在窗体的Load事件里这么写:

private void MainForm_Load(object sender, EventArgs e)
{
    // 获取主屏幕的工作区
    Rectangle workArea = Screen.PrimaryScreen.WorkingArea;
    // 设置窗体的边界为工作区
    this.Bounds = workArea;
}

同样的道理,WorkingArea属性已经帮你处理了任务栏的位置,直接用它来设置窗体大小就没问题。

额外提示

  • 不要依赖WindowState = Maximized:当BorderStyle为None时,这个属性的最大化行为是「填满整个屏幕」,不会考虑任务栏,所以直接设置Bounds是更可靠的方案。
  • 多显示器场景:如果你的应用需要支持多显示器,可以根据窗体所在的屏幕来获取对应的工作区,比如在Delphi里用Screen.MonitorFromWindow,C#里用Screen.FromControl(this)来获取当前屏幕的工作区。

内容的提问来源于stack exchange,提问作者Tallys Ferrante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:17:57