如何使WinForms应用全屏显示


109

我有一个WinForms应用程序,我正在尝试使其全屏显示(有点像VS在全屏模式下所做的一样)。

目前,我设置FormBorderStyleNoneWindowStateMaximized这给我多一点空间,但如果它是可见它不包括放在任务栏上。

我还需要做什么来使用该空间?

对于奖励积分,我是否可以做些什么使自己的MenuStrip自动皮具也放弃该空间?

Answers:


150

对于基本问题,以下将解决问题(隐藏任务栏)

private void Form1_Load(object sender, EventArgs e)
{
    this.TopMost = true;
    this.FormBorderStyle = FormBorderStyle.None;
    this.WindowState = FormWindowState.Maximized;
}

但是,有趣的是,如果交换最后两行,则任务栏仍然可见。我认为这些动作的顺序将很难通过属性窗口来控制。


4
订购问题是为什么它以前对我不起作用。我实际上是按照该顺序设置属性的,但是当表单已经最大化时,将边框设置为none不会覆盖任务栏。我通过“恢复”更改边界的表格然后最大化来解决此问题。

3
我有正确的顺序,它不起作用。任务栏始终可见,而应用程序不在其下方,它只是为任务栏留有空闲空间。(Win7)
Preza8

@ Preza8-阅读Grady的评论,检查是否适合您的情况。
Henk Holterman

1
抱歉,我已经很长时间没有在这里在线了,我忘了我是怎么做到的,但是我记得在尝试随机执行这些命令后会有所帮助。
Preza8

注意:由于某些原因,我必须设置属性并将其放入代码中
Joe Phillips

22

经过测试且简单的解决方案

我一直在SO和其他一些站点中寻找该问题的答案,但是一个答案对我来说非常复杂,而另一些答案根本无法正常工作,因此经过大量代码测试后,我解决了这个难题。

注意:我使用的是Windows 8,并且任务栏未处于自动隐藏模式。

我发现在执行任何修改之前将WindowState设置为“正常”将通过未覆盖的任务栏停止错误。

代码

我创建了具有两个方法的此类,第一个方法进入“全屏模式”,第二个离开“全屏模式”。因此,您只需要创建此类的对象,然后将要设置全屏的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;
        }
    }

我将相同的答案放在另一个不确定的问题上,我不确定是否重复。(链接到另一个问题:如何在任务栏顶部全屏显示Windows窗体?


2
出于好奇,您为什么要用一个完整的枚举来描述真假条件?
内森·里德利

2
很久以前,我只是在抓紧编写代码的时候就写了这个,请注意我年轻的笨拙。的确确实没有任何意义,我应该只使用布尔类型。
Zignd

它对我有用,而且我还必须targetForm.WindowState = FormWindowState.Normal;在开始全屏显示时进行设置。用于处理用户从最大化窗口进入全屏的情况。
gneri

6

对于menustrip问题,请尝试设置

MenuStrip1.Parent = Nothing

在全屏模式下,它将消失。

并且当退出全屏模式时,menustrip1.parent再次将重置为表格,菜单栏将再次正常。


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

我最近制作了一个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

6
如果有两个程序这样做怎么办?如果您的程序在有机会取消隐藏任务栏之前崩溃了,该怎么办?
Tmdean

@Tmdean:就我而言,这不是问题,该程序在mashines上运行,该程序专用于仅在候诊室的屏幕上运行我的程序。
Stefan

@Tmdean:关于两个程序是否做到这一点的观点是正确的,如果处理不正确,可能会使事情搞砸。
Stefan


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将创建一个异常。


1

在“表单移动事件”上添加以下内容:

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);
}

1

我研究了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;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.