C# - 为什么全屏的Winform应用程序不总是覆盖任务栏?

23

我正在使用 Windows Vista 和 C#.net 3.5,但是我让朋友在 XP 上运行程序时出现了同样的问题。

所以我有一个在后台运行的 C# 程序,并在 SystemTray 中具有图标。我有一个低级别的键盘钩子,所以当我按下两个键(在这种情况下是 Ctr+windows)时,它会打开应用程序的主窗体。该窗体在组合键按下事件处理程序中被设置为全屏显示:

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

基本上它是有效的。当我按下CTRL+Windows键时,它会带出表单,无论我给哪个程序焦点。但有时候,任务栏仍然会显示在表单上方,这不是我想要的。我希望每次按下那个键组合时都是全屏的。

我觉得它可能与最初拥有焦点的应用程序有关。但即使我点击我的主窗体,任务栏有时也会停留在那里。所以我想知道焦点是否真的是问题。它似乎有时只是任务栏很顽固,不想坐在我的程序后面。

有人有任何想法如何解决这个问题吗?

编辑:更多细节- 我正在尝试实现与将Web浏览器置于全屏模式或将PowerPoint置于演示文稿模式相同的效果。

在Windows表单中,您可以通过将边框样式设置为无并最大化窗口来实现此目的。但由于某种原因,有时窗口不会覆盖任务栏。一半的时间它会覆盖。

如果我将主窗口置于最上面,则单击它时其他窗口将落后于它,如果隐藏任务栏,则不希望如此。

5个回答

20

尝试这样做(其中this是您的表单):

this.Bounds = Screen.PrimaryScreen.Bounds;
this.TopMost = true;

这将把表单设置为全屏,它将覆盖任务栏。


1
为了使其正常工作,您需要确保窗体最大化。 - Ryan Lundy
哦,唯一的问题是我不能让它成为TopMost,因为我有其他窗口覆盖在它上面,而且如果我点击“这个”,那么所有其他窗口都会在它后面。 - Joel
2
嘿,那里有一个小细节。如果用户勾选了“将任务栏保持在其他窗口之上”,我对你想要的是否可以在没有TopMost的情况下完成表示怀疑。但是您也可以拥有多个TopMost窗口,活动窗口将是最顶层的。 - Ryan Lundy

2

我尝试了许多解决方案,其中一些方案可以在Windows XP上运行,但全部都无法在Windows 7上运行。最终,我编写了一个简单的方法来解决这个问题。

private void GoFullscreen(bool fullscreen)
    {
        if (fullscreen)
        {
            this.WindowState = FormWindowState.Normal;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Bounds = Screen.PrimaryScreen.Bounds;
        }
        else
        {
            this.WindowState = FormWindowState.Maximized;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
        }
    }

代码的顺序很重要,如果更改WindwosState和FormBorderStyle的位置,它将无法工作。

这种方法的优点之一是将TOPMOST保留在false状态,允许其他窗体覆盖主窗体。

这绝对解决了我的问题。


1
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.F11)
        if (FormBorderStyle == FormBorderStyle.None)
        {
            FormBorderStyle = FormBorderStyle.Sizable;
            WindowState = FormWindowState.Normal;
        }
        else
        {
            SuspendLayout();
            FormBorderStyle = FormBorderStyle.None;
            WindowState = FormWindowState.Maximized;
            ResumeLayout();
        }
}

0
据我所知,任务栏的位置取决于“将任务栏置于其他窗口之上”设置,可能会在窗口上方或下方。(至少在XP中是这样的措辞。)我想你可以尝试检测此设置并在需要时切换它?

4
根据你的偏好更改用户选择的设置是不好的做法。最好找出如何使用API以正确的方式获得所需的行为。 - Wedge
该设置仅适用于窗口应用程序,而不适用于全屏应用程序。因为当我玩游戏或将我的网络浏览器设为全屏时,它会覆盖任务栏。 - Joel
全屏应用程序(如游戏)将显示模式切换到DirectX、OpenGL或完全超出窗口系统的其他内容,从而使程序获得原始视频缓冲区访问权限。这是在窗口系统内部完成的,因此我提到的设置适用。 - jdmichal

0
尝试调整窗体大小并将其置于 z-顺序的前面,如下所示:
        Rectangle screenRect = Screen.GetBounds(this);
        this.Location = screenRect.Location;
        this.Size = screenRect.Size;
        this.BringToFront();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接