Como eu faço um aplicativo WinForms ir em canvas cheia

Eu tenho um aplicativo WinForms que estou tentando fazer em canvas cheia (um pouco como o que o VS faz no modo de canvas cheia).

Atualmente estou configurando FormBorderStyle para None e WindowState para Maximized que me dá um pouco mais de espaço, mas não cobre a barra de tarefas se estiver visível.

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

Para pontos de bônus, há algo que eu possa fazer para fazer com que meu AutoShide do MenuStrip desista desse espaço?

Para a questão básica, o seguinte fará o truque (escondendo 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 permanece visível. Eu acho que a seqüência dessas ações será difícil de controlar com a janela de propriedades.

Uma solução testada e simples

Eu tenho procurado por uma resposta para essa pergunta no SO e em alguns outros sites, mas um deu uma resposta foi muito complexa para mim e algumas outras respostas simplesmente não funcionam corretamente, então depois de muito teste de código eu 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 configurar o WindowState para Normal antes de executar qualquer modificação interromperá o erro com a barra de tarefas não coberta.

O código

Eu criei esta class que tem dois methods, o primeiro entra no “modo de canvas cheia” e o segundo deixa o “modo de canvas cheia”. Portanto, você só precisa criar um object dessa class e passar o Form que deseja definir em canvas cheia como um 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 esta mesma resposta em outra pergunta que não tenho certeza se é uma duplicata ou não desta. (Link para a outra pergunta: Como exibir um formulário do Windows em canvas cheia no topo da barra de tarefas? )

E para a menustrip-question, tente definir

 MenuStrip1.Parent = Nothing 

quando no modo de canvas cheia, ele deve desaparecer.

E quando sair do modo fullscreen, redefina o menustrip1.parent para o formulário novamente e a placa de menu será normal novamente.

Você pode usar o seguinte código para caber na canvas do sistema e a barra de tarefas fica 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 precisa usar:

  this.TopMost = true; 

Essa linha interfere com alt+tab para alternar para outro aplicativo. (“TopMost” significa que a janela fica no topo de outras janelas, a menos que elas também estejam marcadas como “TopMost”.)

Recentemente, criei um aplicativo Mediaplayer e usei chamadas de API para garantir que a barra de tarefas estivesse oculta quando o programa estava sendo executado em canvas cheia e restaurasse a barra de tarefas quando o programa não estava em canvas cheia ou não tinha foco ou era 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 

Você precisa definir sua janela para ser o mais alto.

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; ///  /// Goes to fullscreen or the old state. ///  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 class do seu Formulário (Exemplo: partial class Form1 : Form { /* Code goes here */ } ) ou não funcionará porque se você não colocar em qualquer formulário, codifique this irá criar um exceção.