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? )