最大化的无边框形式涵盖任务栏

时间:2014-10-03 01:29:45

标签: c# winforms taskbar

一个问题是asked here,但提供的解决方案都不适用于.NET 4.0 / Win7 / 8.1。答案围绕未将MaximizeBox设置为false,但以下代码段显示它无法正常工作(即表单无论如何都覆盖整个屏幕(在Win7和8.1上使用ClassicShell进行测试)。我需要在多个屏幕和设置中工作MaximumSize效果不佳:当表单没有最大化时,应允许用户将表单宽度跨越两个监视器。还没有BeforeMaximize个事件加入。所以你不能在MaximumSize事件中设置OnMove

public TestForm()
{
    InitializeComponent();

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

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

编辑:设置MaximizedBounds(由Hans Passant回答)在辅助屏幕大于主屏幕的辅助屏幕中不起作用。 (注意:以下是Hans'答案的修改版本,因为他在二级屏幕上无法正常工作)

e.g。

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

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

6 个答案:

答案 0 :(得分:1)

这个派对迟到了 - 无论如何 - 这对我有用:

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;

答案 1 :(得分:0)

如果您的无边框窗口覆盖任务栏,则可以执行此操作:

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

这样做: 在加载时最大化带边框的窗口并将最大尺寸设置为带边框的最大化 - 它不包括任务栏。 在此之后,它删除边框并将窗口返回到正常状态。 将此代码段添加到加载部分。 对不起可能的错误,我来自波兰:)

答案 2 :(得分:0)

这个问题来得很晚,但是在我刚刚使用的.net 4.7.2中

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

线索都在以前的帖子中,但这似乎更简洁。

答案 3 :(得分:0)

我参加派对很晚,但是基于rysieł建议的解决方案,我终于解决了我的问题:

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

答案 4 :(得分:0)

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

this.MaximizedBounds = Screen.GetWorkingArea(this);

答案 5 :(得分:0)

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

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