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上画一张大于全屏的图片(至少3000*3000像素)。在窗口最大化下用鼠标拖动图片,必须画面流畅。