我有一个WinForms应用程序,我正在尝试使其全屏(类似于VS在全屏模式下的做法)。
目前,我将FormBorderStyle
设置为None
并将WindowState
设置为Maximized
,这样可以给我更多的空间,但如果任务栏可见,它不会覆盖任务栏。
我需要做什么才能利用那部分空间呢?
为了获得额外加分,是否有办法使我的MenuStrip
自动隐藏以释放那部分空间呢?
对于基础问题,下面的方法可以解决(隐藏任务栏)
private void Form1_Load(object sender, EventArgs e)
{
this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
}
但有趣的是,如果你交换这两行代码,任务栏仍然可见。我认为这些操作的顺序可能很难通过属性窗口来控制。
我在 Stack Overflow 和其他一些网站上寻找了这个问题的答案,但一个给出的答案对我来说非常复杂,其他一些答案则根本不能正确地解决问题,所以经过大量代码测试后,我解决了这个难题。
注意:我正在使用 Windows 8,我的任务栏没有设置为自动隐藏模式。
我发现在进行任何修改之前将 WindowState 设置为 Normal 将停止未被覆盖的任务栏的错误。
我创建了这个类,它有两个方法,第一个进入“全屏模式”,第二个离开“全屏模式”。因此,您只需要创建该类的对象,并将要设置为全屏的窗体作为参数传递给 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;
}
}
我已经把这个相同的答案放在另一个问题上了,我不确定它是否与这个重复了。(链接到另一个问题:如何在任务栏顶部以全屏显示Windows窗体?)
targetForm.WindowState = FormWindowState.Normal;
。这是为了处理用户从最大化窗口进入全屏的情况。 - gneriMenuStrip1.Parent = Nothing
当处于全屏模式时,应该使其消失。
退出全屏模式时,将 menustrip1.parent
重置为窗体,菜单栏就会恢复正常。
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")。
最近我制作了一个媒体播放器应用程序,我使用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
我致力于改进Zingd的想法,让它更加易用。
同时,我还添加了标准的F11键来切换全屏模式。
现在所有内容都在FullScreen类中,所以您不需要在表单中声明一堆变量。您只需在表单的构造函数中实例化一个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;
}
}
你需要将窗口设置为最顶层。
我不知道它是否适用于.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.
注意: 您必须将它放在您的窗体类中(例如:
partial class Form1 : Form { /* Code goes here */ }
),否则它将无法工作,因为如果您不将其放置在任何窗体上,代码this
将会引发异常。
FormBorderStyle
设为 FixedSingle
或 Fixed3D
将 MaximizeBox
设置为False
将 WindowState
设置为Maximized
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);
}