【问题标题】:Maximized borderless form covers taskbar最大化无边框表单覆盖任务栏
【发布时间】:2021-05-19 00:23:21
【问题描述】:

一个问题是asked here,但所提供的解决方案均不适用于 .NET 4.0 / Win7/8.1。答案围绕着不将 MaximizeBox 设置为 false 但以下 sn-p 显示它不起作用(即表单无论如何都覆盖了整个屏幕(在 Win7 和 8.1 上使用 ClassicShell 测试)。我需要这个跨多个屏幕和设置工作MaximumSize 不能很好地工作:当表单没有最大化时,应该允许用户的表单宽度跨越两个监视器。也没有 BeforeMaximize 事件可以挂钩。所以你不能简单地设置 @ 987654324@ 在OnMove 事件中。

public TestForm()
{
    InitializeComponent();

    FormBorderStyle = FormBorderStyle.None;
    WindowState = FormWindowState.Maximized;
}

VS2013 似乎可以在不覆盖任务栏的情况下做到这一点。

编辑:设置 MaximizedBounds(由 Hans Passant 回答)在辅助屏幕大于主屏幕的辅助屏幕中不起作用。 (注意:以下是汉斯答案的修改版本,因为他在辅助屏幕中根本不起作用)

例如

protected override void OnLocationChanged(EventArgs e)
{
    var workArea = Screen.FromControl(this).WorkingArea;
    MaximizedBounds = new Rectangle(0, 0, workArea.Width, workArea.Height);
    Debug.WriteLine(MaximizedBounds);

    base.OnLocationChanged(e);
}

// Button click event (hit when form maximized):
WinApi.RECT rect;
WinApi.GetWindowRect(Handle, out rect);
Debug.WriteLine(rect);

输出:

OnLocationChanged: {X=0,Y=0,Width=1920,Height=1040}

ButtonClick when form is maximized: {Left=1366,Top=-216,Right=3840,Bottom=876}

结果是:

最大宽度 = 3840 - 1366 = 2474

最大高度 = 876 + 216 = 1092

框架从哪里得到这些数字?

【问题讨论】:

  • 在您的上述代码中再添加一行,来自投票最高的答案。 MaximumSize = Screen.FromControl(this).WorkingArea.Size;
  • 编辑了问题以解释为什么MaximumSize 不适用于多显示器。
  • 分配表单的 MaximizedBounds 属性。
  • 辅助屏幕上的最大化边界不起作用。 .NET 框架错误??
  • 将近两年后,我遇到了完全相同的问题。你有没有找到解决办法?

标签: c# winforms taskbar


【解决方案1】:

如果你的无边框窗口覆盖了任务栏,你可以这样做:

this.FormBorderStyle = FormBorderStyle.Sizable;
this.WindowState = FormWindowState.Maximized;
this.MaximumSize = this.Size;
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Normal;

这样做是这样的: 加载时最大化带边框的窗口并将最大尺寸设置为带边框的最大化 - 它不覆盖任务栏。 在此之后,它会删除边框并将窗口返回到正常状态。 将此 sn-p 添加到加载部分。 抱歉可能出现错误,我来自波兰 :)

【讨论】:

    【解决方案2】:

    这个聚会迟到了——无论如何——这对我有用:

    Screen screen = Screen.FromControl(this);
    int x = screen.WorkingArea.X - screen.Bounds.X;
    int y = screen.WorkingArea.Y - screen.Bounds.Y;
    this.MaximizedBounds = new Rectangle(x, y,
        screen.WorkingArea.Width, screen.WorkingArea.Height);
    this.MaximumSize = screen.WorkingArea.Size;
    this.WindowState = FormWindowState.Maximized;
    

    【讨论】:

      【解决方案3】:

      仅将此添加到表单的 OnResize 事件中

      this.MaximizedBounds = Screen.GetWorkingArea(this);
      

      【讨论】:

        【解决方案4】:

        我迟到了 6 年,但对于其他遇到此问题的人,这两行应该放在 Form.Load 方法中:

        System.Drawing.Rectangle rect = Screen.GetWorkingArea(this);
        this.MaximizedBounds = Screen.GetWorkingArea(this);
        

        【讨论】:

          【解决方案5】:

          这很晚,但在 .net 4.7.2 中我刚刚使用

          Rectangle wa = Screen.FromControl(this).WorkingArea;
          this.MaximumSize = new Size(wa.Width, wa.Height);
          WindowState = FormWindowState.Maximized;
          

          线索都在前面的帖子里了,不过这个好像更简洁了。

          【讨论】:

          • 它的高度效果很好,但是当我最大化时我的宽度有点短,所以我可以看到桌面。
          【解决方案6】:

          我迟到了,但根据 ry sieł 建议的解决方案,我终于解决了我的问题:

          • 内部OnLoad事件:
          this.FormBorderStyle = FormBorderStyle.Sizable;
          this.WindowState = FormWindowState.Maximized;
          
          • 内部OnShow事件:
          this.MaximumSize = this.Size;
          this.FormBorderStyle = FormBorderStyle.None;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-26
            • 2012-09-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多