C# 为什么赢了;全屏winform应用程序是否总是覆盖任务栏?
我使用的是WindowsVista和C#.NET3.5,但我让我的朋友在XP上运行这个程序,遇到了同样的问题 因此,我有一个C#程序,我在后台运行,系统托盘中有一个图标。我有一个低级键盘挂钩,所以当我按下两个键(本例中为Ctr+windows)时,它将拉出应用程序的主窗体。表单在组合键“按偶数”处理程序中设置为全屏:C# 为什么赢了;全屏winform应用程序是否总是覆盖任务栏?,c#,.net,winforms,fullscreen,keyboard-hook,C#,.net,Winforms,Fullscreen,Keyboard Hook,我使用的是WindowsVista和C#.NET3.5,但我让我的朋友在XP上运行这个程序,遇到了同样的问题 因此,我有一个C#程序,我在后台运行,系统托盘中有一个图标。我有一个低级键盘挂钩,所以当我按下两个键(本例中为Ctr+windows)时,它将拉出应用程序的主窗体。表单在组合键“按偶数”处理程序中设置为全屏: this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Maximized;
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
所以它基本上是有效的。当我点击CTR+Windows时,无论我关注的是哪个程序,它都会显示表单。但有时候,任务栏仍然会显示在表单上,这是我不想要的。我希望当我按下组合键时,它总是全屏显示
我认为这与应用程序最初的焦点有关。但即使我点击主窗体,任务栏有时也会停留在那里。所以我想知道焦点是否真的是问题所在。有时候任务栏似乎很固执,不想坐在我的程序后面
有人知道我该怎么解决这个问题吗
编辑:更多详细信息-
我试图实现web浏览器在全屏模式或powerpoint演示模式下的效果
在windows窗体中,可以通过将边框样式设置为“无”并最大化窗口来实现这一点。但有时由于某些原因,窗口无法覆盖任务栏。一半的时间会
如果我的主窗口位于最上面,那么当我单击它时,其他窗口将落在后面,如果任务栏被隐藏,我不希望出现这种情况。据我所知,根据“将任务栏置于其他窗口之上”设置,任务栏位于窗口上方或下方。(至少,这是XP中的措词。)我想您可以试试看是否可以检测到此设置,并在需要时切换它?尝试调整窗体大小并将其置于z顺序的前面,如下所示:
Rectangle screenRect = Screen.GetBounds(this);
this.Location = screenRect.Location;
this.Size = screenRect.Size;
this.BringToFront();
试试这个(其中这个是您的表单):
这会将窗体设置为全屏,并覆盖任务栏。我尝试了很多解决方案,其中一些可以在Windows XP上运行,而所有的都不能在Windows 7上运行。毕竟我写了一个简单的方法来做到这一点
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();
}
}
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的位置,代码的顺序将不起作用
这种方法的一个优点是将最上面的表单保留为false,从而允许其他表单覆盖主表单
这绝对解决了我的问题。根据您的偏好更改用户选择的设置是一种不好的做法。最好了解如何使用API以正确的方式获得所需的行为。该设置仅适用于窗口应用程序,而不适用于全屏应用程序。因为当我玩游戏或将我的网络浏览器设置为全屏时,它会覆盖任务栏。像游戏这样的全屏应用程序正在将显示模式切换到DirectX或OpenGL或完全在窗口系统之外的其他模式,从而使程序可以访问原始视频缓冲区。这是在窗口系统中设置的,所以我提到的设置适用。为了实现这一点,你需要确保表单没有最大化。哦,唯一的问题是我不能让它处于最顶端,因为我有其他位于它上面的窗口是最顶端的,所以如果我点击“这个”,那么所有其他窗口都会在它后面。呵呵。那里的小细节。我怀疑如果用户选中了“将任务栏置于其他窗口之上”,是否可以在没有顶层的情况下完成您想要的操作。但是你也可以有多个最上面的窗口,而活动窗口将是,呃,最上面的测试。
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;
}
}