我有一个WinForms应用程序,我试图全屏(有点像VS在全屏模式下)。
目前,我将FormBorderStyle
设置为None
,将WindowState
设置为Maximized
,这为我提供了更多空间,但如果它是任务栏,则不会覆盖任务栏可见。
我还需要做些什么才能使用该空间?
对于奖励积分,我可以采取哪些措施让我的MenuStrip
自动隐藏也放弃这个空间吗?
答案 0 :(得分:139)
对于基本问题,以下将执行技巧(隐藏任务栏)
private void Form1_Load(object sender, EventArgs e)
{
this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
}
但是,有趣的是,如果你交换最后两行,任务栏仍然可见。我认为使用属性窗口很难控制这些操作的顺序。
答案 1 :(得分:18)
我一直在SO和其他一些网站寻找这个问题的答案,但是一个答案对我来说非常复杂,而其他一些答案根本无法正常工作,所以经过大量的代码测试我解决了这个难题。
注意:我正在使用 Windows 8 ,我的任务栏未处于自动隐藏模式。
我发现在执行任何修改之前将WindowState设置为Normal将使用未覆盖的任务栏停止错误。
我创建了这个有两种方法的类,第一种进入“全屏模式”,第二种进入“全屏模式”。因此,您只需要创建此类的对象,并将要设置为全屏的Form作为参数传递给EnterFullScreenMode方法或LeaveFullScreenMode方法:
class FullScreen
{
public void EnterFullScreenMode(Form targetForm)
{
targetForm.WindowState = FormWindowState.Normal;
targetForm.FormBorderStyle = FormBorderStyle.None;
targetForm.WindowState = FormWindowState.Maximized;
}
public void LeaveFullScreenMode(Form targetForm)
{
targetForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
targetForm.WindowState = FormWindowState.Normal;
}
}
private void fullScreenToolStripMenuItem_Click(object sender, EventArgs e)
{
FullScreen fullScreen = new FullScreen();
if (fullScreenMode == FullScreenMode.No) // FullScreenMode is an enum
{
fullScreen.EnterFullScreenMode(this);
fullScreenMode = FullScreenMode.Yes;
}
else
{
fullScreen.LeaveFullScreenMode(this);
fullScreenMode = FullScreenMode.No;
}
}
我已经在另一个问题上提出了相同的答案,我不确定这个问题是否重复。 (链接到另一个问题:How to display a Windows Form in full screen on top of the taskbar?)
答案 2 :(得分:6)
对于menustrip问题,请尝试设置
MenuStrip1.Parent = Nothing
在全屏模式下,它应该消失。
退出全屏模式时,请再次将menustrip1.parent
重置为表单,再次将menustrip恢复正常。
答案 3 :(得分:5)
您可以使用以下代码来适合您的系统屏幕,并且任务栏可见。
private void Form1_Load(object sender, EventArgs e)
{
// hide max,min and close button at top right of Window
this.FormBorderStyle = FormBorderStyle.None;
// fill the screen
this.Bounds = Screen.PrimaryScreen.Bounds;
}
无需使用:
this.TopMost = true;
该行干扰alt+tab
切换到其他应用程序。 (“TopMost”表示窗口保持在其他窗口的顶部,除非它们也标记为“TopMost”。)
答案 4 :(得分:3)
我最近制作了一个Mediaplayer应用程序,我使用API调用来确保在程序全屏运行时隐藏任务栏,然后在程序没有全屏或没有焦点或退出时恢复任务栏。
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Integer, ByVal nCmdShow As Integer) As Integer
Sub HideTrayBar()
Try
Dim tWnd As Integer = 0
Dim bWnd As Integer = 0
tWnd = FindWindow("Shell_TrayWnd", vbNullString)
bWnd = FindWindowEx(tWnd, bWnd, "BUTTON", vbNullString)
ShowWindow(tWnd, 0)
ShowWindow(bWnd, 0)
Catch ex As Exception
'Error hiding the taskbar, do what you want here..
End Try
End Sub
Sub ShowTraybar()
Try
Dim tWnd As Integer = 0
Dim bWnd As Integer = 0
tWnd = FindWindow("Shell_TrayWnd", vbNullString)
bWnd = FindWindowEx(tWnd, bWnd, "BUTTON", vbNullString)
ShowWindow(bWnd, 1)
ShowWindow(tWnd, 1)
Catch ex As Exception
'Error showing the taskbar, do what you want here..
End Try
End Sub
答案 5 :(得分:2)
您需要将窗口设置为最顶层。
答案 6 :(得分:2)
我研究了Zingd的想法,并使其变得更简单。
我还添加了标准的 F11键以切换全屏模式。
现在所有内容都在FullScreen类中,因此您不必在Form中声明一堆变量。您只需在表单的构造函数中实例化FullScreen对象:
FullScreen fullScreen;
public Form1()
{
InitializeComponent();
fullScreen = new FullScreen(this);
}
请注意,这假设您创建FullScreen对象时表单未最大化。
您只需使用类的功能之一来切换全屏模式:
fullScreen.Toggle();
或者如果您需要显式处理它:
fullScreen.Enter();
fullScreen.Leave();
using System.Windows.Forms;
class FullScreen
{
Form TargetForm;
FormWindowState PreviousWindowState;
public FullScreen(Form targetForm)
{
TargetForm = targetForm;
TargetForm.KeyPreview = true;
TargetForm.KeyDown += TargetForm_KeyDown;
}
private void TargetForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.F11)
{
Toggle();
}
}
public void Toggle()
{
if (TargetForm.WindowState == FormWindowState.Maximized)
{
Leave();
}
else
{
Enter();
}
}
public void Enter()
{
if (TargetForm.WindowState != FormWindowState.Maximized)
{
PreviousWindowState = TargetForm.WindowState;
TargetForm.WindowState = FormWindowState.Normal;
TargetForm.FormBorderStyle = FormBorderStyle.None;
TargetForm.WindowState = FormWindowState.Maximized;
}
}
public void Leave()
{
TargetForm.FormBorderStyle = FormBorderStyle.Sizable;
TargetForm.WindowState = PreviousWindowState;
}
}
答案 7 :(得分:1)
我不知道它是否适用于.NET 2.0,但它在.NET 4.5.2上起作用。这是代码:
using System;
using System.Drawing;
using System.Windows.Forms;
public partial class Your_Form_Name : Form
{
public Your_Form_Name()
{
InitializeComponent();
}
// CODE STARTS HERE
private System.Drawing.Size oldsize = new System.Drawing.Size(300, 300);
private System.Drawing.Point oldlocation = new System.Drawing.Point(0, 0);
private System.Windows.Forms.FormWindowState oldstate = System.Windows.Forms.FormWindowState.Normal;
private System.Windows.Forms.FormBorderStyle oldstyle = System.Windows.Forms.FormBorderStyle.Sizable;
private bool fullscreen = false;
/// <summary>
/// Goes to fullscreen or the old state.
/// </summary>
private void UpgradeFullscreen()
{
if (!fullscreen)
{
oldsize = this.Size;
oldstate = this.WindowState;
oldstyle = this.FormBorderStyle;
oldlocation = this.Location;
this.WindowState = System.Windows.Forms.FormWindowState.Normal;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
fullscreen = true;
}
else
{
this.Location = oldlocation;
this.WindowState = oldstate;
this.FormBorderStyle = oldstyle;
this.Size = oldsize;
fullscreen = false;
}
}
// CODE ENDS HERE
}
用法:
UpgradeFullscreen(); // Goes to fullscreen
UpgradeFullscreen(); // Goes back to normal state
// You don't need arguments.
注意: 您必须将它放在Form的类中(例如:
partial class Form1 : Form { /* Code goes here */ }
),否则它将无效,因为如果您不将它放在任何表单上,代码this
将创建一个例外。
答案 8 :(得分:1)
如果您想保留表单的边框并且让它覆盖任务栏,请使用以下内容:
将 FormBoarderStyle
设置为 FixedSingle
或 Fixed3D
将 MaximizeBox
设置为 False
将 WindowState
设置为 Maximized
答案 9 :(得分:0)
在“表单移动事件”上添加以下内容:
private void Frm_Move (object sender, EventArgs e)
{
Top = 0; Left = 0;
Size = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
}