Como faço para fazer um aplicativo WinForms ir para tela inteira

109

Eu tenho um aplicativo WinForms que estou tentando fazer em tela inteira (algo parecido com o que o VS faz no modo de tela inteira).

Atualmente estou configurando FormBorderStylepara Nonee WindowStatepara Maximizedque me dá um pouco mais de espaço, mas não cobre a barra de tarefas se estiver visível.

O que preciso fazer para usar esse espaço também?

Para obter pontos de bônus, há algo que eu possa fazer para que meu MenuStripocultar automaticamente também abra mão desse espaço?

Divins Mathew
fonte

Respostas:

150

Para a pergunta básica, o seguinte resolverá (ocultar a barra de tarefas)

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

Mas, curiosamente, se você trocar essas duas últimas linhas, a barra de tarefas permanecerá visível. Acho que a sequência dessas ações será difícil de controlar com a janela de propriedades.

Henk Holterman
fonte
4
O problema do pedido é por que não estava funcionando para mim antes. Na verdade, eu estava definindo as propriedades nessa ordem, mas quando o formulário já está maximizado, definir a borda como nenhuma não se expande para cobrir a barra de tarefas. Eu trabalhei "restaurando" a forma, alterando a borda e, em seguida, maximizando.
3
Eu coloquei na ordem certa e não funciona. A barra de tarefas está sempre visível e o aplicativo não está abaixo dela, apenas deixou espaço livre para a barra de tarefas lá. (Win7)
Preza8
@ Preza8 - leia o comentário de Grady, verifique se isso se aplica à sua situação.
Henk Holterman
1
Sinto muito, não estou online há muito tempo e esqueci como fiz isso, mas lembro que depois de algumas tentativas de ordem aleatória desses comandos ajuda.
Preza8 de
Observação: por algum motivo, tive que definir as propriedades E colocá-las no código
Joe Phillips
22

Uma solução testada e simples

Eu estive procurando uma resposta para esta pergunta no SO e em alguns outros sites, mas uma resposta foi muito complexa para mim e outras respostas simplesmente não funcionam corretamente, então, depois de muitos testes de código, resolvi esse quebra-cabeça.

Nota: Estou usando o Windows 8 e minha barra de tarefas não está no modo de ocultação automática.

Descobri que definir o WindowState como Normal antes de realizar qualquer modificação irá parar o erro com a barra de tarefas não coberta.

O código

Criei esta classe que possui dois métodos, o primeiro entra no "modo tela cheia" e o segundo sai do "modo tela cheia". Portanto, você só precisa criar um objeto desta classe e passar o Form que deseja definir para tela inteira como argumento para o método EnterFullScreenMode ou para o 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;
    }
}

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

Eu coloquei essa mesma resposta em outra questão que não tenho certeza se é uma duplicata ou não desta. (Link para a outra pergunta: Como exibir um Windows Form em tela inteira na parte superior da barra de tarefas? )

Zignd
fonte
2
Por curiosidade, por que você tem um enum inteiro para descrever uma condição verdadeiro / falso?
Nathan Ridley
2
Eu escrevi isso há muito tempo quando eu estava apenas tentando escrever código, por favor, cuidado com minha jovem estupidez. Na verdade, não faz sentido algum e eu deveria simplesmente ter usado um tipo booleano.
Zignd
Funcionou para mim e tive que definir targetForm.WindowState = FormWindowState.Normal;no início para sair da tela inteira também. Isso para lidar com o caso em que o usuário está indo para tela inteira a partir de uma janela maximizada.
gneri
6

E para a questão do menu, tente definir

MenuStrip1.Parent = Nothing

quando no modo de tela inteira, ele deve desaparecer.

E ao sair do modo de tela menustrip1.parentinteira , redefina o para a forma novamente e o menu ficará normal novamente.

Stefan
fonte
5

Você pode usar o código a seguir para ajustar a tela do sistema e a barra de tarefas ficar visível.

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

Não há necessidade de usar:

    this.TopMost = true;

Essa linha interfere alt+tabna mudança para outro aplicativo. ("TopMost" significa que a janela permanece sobre as outras janelas, a menos que também estejam marcadas como "TopMost".)

Raghavendra Devraj
fonte
4

Recentemente, criei um aplicativo Mediaplayer e usei chamadas de API para garantir que a barra de tarefas estava oculta quando o programa estava sendo executado em tela cheia e, em seguida, restaurei a barra de tarefas quando o programa não estava em tela cheia ou não tinha foco ou foi encerrado.

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
fonte
6
E se dois programas fizessem isso? E se o seu programa travar antes de ter a chance de exibir a barra de tarefas?
Segunda
@Tmdean: No meu caso não foi um problema, este programa estava rodando em mashines que eram dedicadas a rodar apenas meu programa em telas em salas de espera.
Stefan
@Tmdean: O ponto sobre se dois programas fizeram isso é válido, ele poderia bagunçar as coisas se não fosse tratado corretamente.
Stefan
2

Você precisa definir sua janela para ser superior.

Tron
fonte
1
Sem dados. Mesmo se eu definir a janela para o topo, ela não cobre a barra de tarefas.
3
Experimente: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx tem mais detalhes, como para multimon
Tron
1

Não sei se funcionará no .NET 2.0, mas funcionou no .NET 4.5.2. Aqui está o 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: Você DEVE colocá-lo dentro da classe do seu Form (Exemplo:) partial class Form1 : Form { /* Code goes here */ }ou não funcionará porque se você não colocá-lo em nenhum formulário, o código thiscriará uma exceção.


fonte
1

No evento de movimentação do formulário, adicione o seguinte:

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
fonte
1

Trabalhei na ideia do Zingd e tornei-a mais simples de usar.

Também adicionei a tecla F11 padrão para alternar o modo de tela inteira.

Configuração

Tudo agora está na classe FullScreen, então você não precisa declarar um monte de variáveis ​​em seu Form. Você acabou de instanciar um objeto FullScreen no construtor do seu formulário:

FullScreen fullScreen;

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

Observe que isso pressupõe que o formulário não está maximizado quando você cria o objeto FullScreen.

Uso

Basta usar uma das funções da classe para alternar para o modo de tela inteira:

fullScreen.Toggle();

ou se você precisar lidar com isso explicitamente:

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
fonte