1

我正在使用 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;
    }
4

3 回答 3

1

However, if i maximise the form manually (user interaction)...

The issue is that your window is already internally marked as being in the maximized state. So maximizing it again will not change the current size of the form. Which will leave the taskbar exposed. You'll need to restore it first back to Normal, then back to Maximized. Yes, that flickers a bit.

    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;
        }
    }
于 2013-02-10T17:07:05.167 回答
0

不知道为什么会这样,我讨厌假设他们可以占据我所有屏幕的应用程序。虽然这对于 1024x768 显示器可能是可以接受的,但当该死的东西决定它拥有我的屏幕时,我的 30 英寸显示器就被浪费了。

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

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

我的 2 美分,这正是我的想法值得;)

于 2013-02-10T01:02:34.530 回答
0

您可以尝试使用 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);
于 2013-02-10T14:01:28.157 回答