¿Cómo hago para que una aplicación WinForms pase a pantalla completa?

109

Tengo una aplicación WinForms que estoy tratando de hacer en pantalla completa (algo parecido a lo que hace VS en modo de pantalla completa).

Actualmente estoy configurando FormBorderStylea Noney WindowStatea lo Maximizedque me da un poco más de espacio, pero no cubre la barra de tareas si está visible.

¿Qué necesito hacer para usar ese espacio también?

Para obtener puntos de bonificación, ¿hay algo que pueda hacer para que mi MenuStripocultación automática ceda ese espacio también?

Divins Mathew
fuente

Respuestas:

150

Para la pregunta base, lo siguiente hará el truco (ocultar la barra de tareas)

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

Pero, curiosamente, si intercambias esas dos últimas líneas, la barra de tareas permanece visible. Creo que la secuencia de estas acciones será difícil de controlar con la ventana de propiedades.

Henk Holterman
fuente
4
El problema del pedido es por qué no me funcionaba antes. De hecho, estaba configurando las propiedades en ese orden, pero cuando el formulario ya está maximizado, la configuración del borde en ninguno no se expande para cubrir la barra de tareas. Trabajé "restaurando" la forma cambiando el borde y luego maximizando.
3
Lo tengo en el orden correcto y no funciona. La barra de tareas siempre está visible y la aplicación no está debajo, simplemente dejó espacio libre para la barra de tareas allí. (Win7)
Preza8
@ Preza8: lee el comentario de Grady, comprueba si se aplica a tu situación.
Henk Holterman
1
Lo siento, no he estado en línea aquí durante mucho tiempo y olvidé cómo lo hice, pero recuerdo que después de algunos intentos, el orden aleatorio de esos comandos ayuda.
Preza8
Nota: Por alguna razón tuve que configurar las propiedades Y poner esto en el código
Joe Phillips
22

Una solución probada y sencilla

He estado buscando una respuesta para esta pregunta en SO y en algunos otros sitios, pero uno dio una respuesta que era muy compleja para mí y otras respuestas simplemente no funcionan correctamente, así que después de muchas pruebas de código resolví este acertijo.

Nota: Estoy usando Windows 8 y mi barra de tareas no está en modo de ocultación automática.

Descubrí que configurar WindowState en Normal antes de realizar cualquier modificación detendrá el error con la barra de tareas no cubierta.

El código

Creé esta clase que tiene dos métodos, el primero entra en el "modo de pantalla completa" y el segundo sale del "modo de pantalla completa". Por lo tanto, solo necesita crear un objeto de esta clase y pasar el formulario que desea configurar a pantalla completa como argumento al método EnterFullScreenMode o al método 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;
    }
}

Ejemplo de uso

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

He colocado esta misma respuesta en otra pregunta de la que no estoy seguro si es un duplicado o no de esta. (Enlace a la otra pregunta: ¿Cómo mostrar un formulario de Windows Form en pantalla completa en la parte superior de la barra de tareas? )

Zignd
fuente
2
Por curiosidad, ¿por qué tiene una enumeración completa para describir una condición de verdadero / falso?
Nathan Ridley
2
Escribí esto hace mucho tiempo cuando solo estaba tratando de escribir código, por favor, cuidado con mi tontería de joven. De hecho, no tiene ningún sentido y debería haber usado simplemente un tipo booleano.
Zignd
Funcionó para mí, y tuve que configurarlo targetForm.WindowState = FormWindowState.Normal;al principio de dejar la pantalla completa también. Eso para manejar el caso en el que el usuario va a pantalla completa desde una ventana maximizada.
gneri
6

Y para la pregunta de menustrip, intente configurar

MenuStrip1.Parent = Nothing

cuando esté en modo de pantalla completa, debería desaparecer.

Y al salir del modo de pantalla completa, restablezca el menustrip1.parentformulario nuevamente y el menú volverá a ser normal.

Stefan
fuente
5

Puede utilizar el siguiente código para que se ajuste a la pantalla del sistema y la barra de tareas esté visible.

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

No es necesario utilizar:

    this.TopMost = true;

Esa línea interfiere con el alt+tabcambio a otra aplicación. ("TopMost" significa que la ventana permanece encima de otras ventanas, a menos que también estén marcadas como "TopMost").

Raghavendra Devraj
fuente
4

Recientemente hice una aplicación Mediaplayer y usé llamadas a API para asegurarme de que la barra de tareas estuviera oculta cuando el programa se ejecutaba en pantalla completa y luego restauré la barra de tareas cuando el programa no estaba en pantalla completa o no tenía el foco o se había salido.

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
Stefan
fuente
6
¿Y si dos programas hicieran esto? ¿Qué pasa si su programa falla antes de que tenga la oportunidad de mostrar la barra de tareas?
Tmdean
@Tmdean: En mi caso no fue un problema, este programa se estaba ejecutando en mashines que estaba dedicado a ejecutar solo mi programa en las pantallas de las salas de espera.
Stefan
@Tmdean: El punto sobre si dos programas hicieron esto es válido, podría estropear las cosas si no se maneja correctamente.
Stefan
2

Debe configurar su ventana para que esté en la parte superior.

Tron
fuente
1
No dados. Incluso si configuro la ventana en la parte superior, no cubre la barra de tareas.
3
Pruebe: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx tiene más detalles, como para multimon
Tron
1

No sé si funcionará en .NET 2.0, pero me funcionó en .NET 4.5.2. Aquí está el código:

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
}

Uso:

UpgradeFullscreen(); // Goes to fullscreen
UpgradeFullscreen(); // Goes back to normal state
// You don't need arguments.

Aviso: DEBE colocarlo dentro de la clase de su formulario (Ejemplo :) partial class Form1 : Form { /* Code goes here */ }o no funcionará porque si no lo coloca en ningún formulario, el código thiscreará una excepción.


fuente
1

En el evento de movimiento de formulario, agregue esto:

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);
}
Segan
fuente
1

Trabajé en la idea de Zingd y la hice más simple de usar.

También agregué la tecla F11 estándar para alternar el modo de pantalla completa.

Preparar

Todo está ahora en la clase FullScreen, por lo que no tiene que declarar un montón de variables en su formulario. Simplemente instancia un objeto FullScreen en el constructor de su formulario:

FullScreen fullScreen;

public Form1()
{
    InitializeComponent();
    fullScreen = new FullScreen(this);
}

Tenga en cuenta que esto asume que el formulario no se maximiza cuando crea el objeto FullScreen.

Uso

Simplemente use una de las funciones de la clase para alternar el modo de pantalla completa:

fullScreen.Toggle();

o si necesita manejarlo explícitamente:

fullScreen.Enter();
fullScreen.Leave();

Código

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;
    }
}
Géraud Benazet
fuente