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

Posted

技术标签:

【中文标题】C# - 为啥全屏 Winform 应用程序不总是覆盖任务栏?【英文标题】:C# - Why won't a fullscreen winform app ALWAYS cover the taskbar?C# - 为什么全屏 Winform 应用程序不总是覆盖任务栏? 【发布时间】:2010-09-12 04:47:51 【问题描述】:

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

所以我有一个在后台运行的 C# 程序,系统托盘中有一个图标。我有一个低级键盘钩子,所以当我按下两个键(在本例中为 Ctr+windows)时,它会拉出应用程序的主窗体。表单在组合按键事件处理程序中设置为全屏:

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

所以它基本上可以工作。当我点击 CTR+Windows 时,无论我关注什么程序,它都会弹出表单。但有时,任务栏仍会显示在表单上,​​这是我不想要的。我希望当我按下那个组合键时它总是全屏显示。

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

有人知道如何解决这个问题吗?

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

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

如果我将主窗口放在最上面,当我单击它时,其他窗口会落在它后面,如果任务栏被隐藏,我不希望这样做。

【问题讨论】:

【参考方案1】:

据我所知,根据“将任务栏保持在其他窗口之上”设置,任务栏位于窗口上方或下方。 (至少,这是 XP 中的措辞。)我想您可以尝试看看是否可以检测到此设置并在需要时切换它?

【讨论】:

根据您的偏好更改用户选择的设置是不好的做法。最好了解如何使用 API 以正确的方式获得所需的行为。 该设置仅适用于窗口应用程序,不适用于全屏应用程序。因为当我玩游戏或将网络浏览器设置为全屏时,它会覆盖任务栏。 游戏等全屏应用程序将显示模式切换为 DirectX 或 OpenGL 或完全在窗口系统之外的其他方式,从而为程序提供原始视频缓冲区访问权限。这是来自窗口系统,所以我提到的设置适用。【参考方案2】:

尝试调整表单大小并将其置于 z 顺序的前面,如下所示:

        Rectangle screenRect = Screen.GetBounds(this);
        this.Location = screenRect.Location;
        this.Size = screenRect.Size;
        this.BringToFront();

【讨论】:

【参考方案3】:

试试这个(this 是你的表单):

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

这会将表单设置为全屏,并且会覆盖任务栏。

【讨论】:

为了让这个工作,你要确保表单没有最大化。 哦,唯一的问题是我不能让它成为 TopMost,因为我上面还有其他窗口是 TopMost,所以如果我点击“这个”然后所有其他窗口会落后的。 嘿。那里的小细节。如果用户选中了“将任务栏保持在其他窗口之上”,我怀疑您是否可以没有 TopMost 来完成您想要的操作。但您也可以有多个 TopMost 窗口,活动的窗口将是,呃,TopMostest。【参考方案4】:
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();
        

【讨论】:

【参考方案5】:

我尝试了很多解决方案,其中一些适用于 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,从而允许其他表单超越主表单。

它绝对解决了我的问题。

【讨论】:

以上是关于C# - 为啥全屏 Winform 应用程序不总是覆盖任务栏?的主要内容,如果未能解决你的问题,请参考以下文章

C# 实现Winform全屏后不遮挡任务栏,显示任务栏

C# winform 控件拖动问题

C# winform 适应屏幕分辨率切换问题

C#在winform上画一张大于全屏的图片(至少3000*3000像素)。在窗口最大化下用鼠标拖动图片,必须画面流畅。

C#在winform上画一张大于全屏的图片(至少3000*3000像素)。在窗口最大化下用鼠标拖动图片,必须画面流畅。

C#在winform上画一张大于全屏的图片(至少3000*3000像素)。在窗口最大化下用鼠标拖动图片,必须画面流畅。