最大化无边界窗体仅在从正常大小最大化时才覆盖任务栏

本文关键字:最大化 常大小 任务栏 覆盖 边界 窗体 | 更新日期: 2023-09-27 17:58:26

我正在使用C#,使用无边界形式和最大化方法为应用程序提供"全屏模式"。当我使表单无边界而不是最大化时,这非常有效——你在屏幕上看到的只是表单,任务栏被覆盖了。。然而,如果我手动最大化表单(用户交互),然后尝试使其无边界&最大化后,任务栏被绘制在窗体上(由于我没有使用WorkingArea,窗体上的部分控件被隐藏。这是不显示任务栏的预期行为)。我尝试将表单的属性TopMost设置为true,但似乎没有任何效果。

有没有什么方法可以重新修改这个以始终覆盖任务栏?

if (this.FormBorderStyle != System.Windows.Forms.FormBorderStyle.None)
    {        
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    }
    else
    {
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
    }
    if (this.WindowState != FormWindowState.Maximized)
    {
    this.WindowState = FormWindowState.Maximized;
    }
    else
    {
        if (this.FormBorderStyle == System.Windows.Forms.FormBorderStyle.Sizable)  this.WindowState=FormWindowState.Normal;
    }

最大化无边界窗体仅在从正常大小最大化时才覆盖任务栏

然而,如果我手动最大化表单(用户交互)。。。

问题是您的窗口已经在内部标记为处于最大化状态。因此,再次最大化不会改变窗体的当前大小。这将暴露任务栏。您需要先将其恢复为"正常",然后再恢复为"最大化"。是的,有点闪烁。

    private void ToggleStateButton_Click(object sender, EventArgs e) {
        if (this.FormBorderStyle == FormBorderStyle.None) {
            this.FormBorderStyle = FormBorderStyle.Sizable;
            this.WindowState = FormWindowState.Normal;
        }
        else {
            this.FormBorderStyle = FormBorderStyle.None;
            if (this.WindowState == FormWindowState.Maximized) this.WindowState = FormWindowState.Normal;
            this.WindowState = FormWindowState.Maximized;
        }
    }

不确定为什么会发生这种情况,我讨厌应用程序认为它们可以占据我的所有屏幕。虽然这对于1024x768显示器来说可能是可以接受的,但当这个该死的东西决定它拥有我的屏幕时,我的30英寸显示器就浪费了

因此,我要传达的信息是,也许要专注于确保所有控件都可见,而不是专注于最大化窗口。

您始终可以检测窗口大小的更改,然后覆盖默认行为,以处理遇到的意外问题。但是,与其最大化并占用所有30英寸的显示器,不如计算窗口需要有多大,并相应地设置大小

我的2美分,这正是我思想的价值;)

您可以尝试使用WinApi SetWindowPos方法,如下所示:

public static class WinApi
{
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, 
                                    int x, int y, int width, int height, 
                                    uint flags);
    static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
    const uint SWP_NOSIZE = 0x0001;
    const uint SWP_NOMOVE = 0x0002;
    const uint SWP_SHOWWINDOW = 0x0040;
    public static void SetFormTopMost(Form form)
    {
        SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, 
                     SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
    }
}

在你的表格中,这样称呼它:

WinApi.SetFormTopMost(this);