Como iniciar o aplicativo WinForm minimizado na bandeja?

Eu criei com sucesso um aplicativo que minimiza para a bandeja usando um NotifyIcon. Quando o formulário é fechado manualmente, ele é ocultado com êxito na área de trabalho, na barra de tarefas e na guia alt. O problema ocorre ao tentar iniciar com o aplicativo minimizado. No início, o problema era que o aplicativo seria minimizado, mas ainda assim apareceria na checkbox de diálogo da guia alt. Alterar o FormBorderStyle para uma das opções de ToolWindow (da opção “None”) corrigiu isso, mas introduziu outro problema. Quando o aplicativo inicia pela primeira vez, a barra de título da janela minimizada é visível logo acima do menu Iniciar:

insira a descrição da imagem aqui

Abrir o formulário e o fechamento faz com que ele se esconda corretamente. Eu tentei muitas variações, mas aqui está essencialmente como está funcionando agora …

WindowState está definido como minimizado no Designer. Depois de alguma boot no construtor eu tenho as seguintes linhas:

this.Visible = false; this.ShowInTaskbar = false; 

Quando o NotifyIcon é clicado duas vezes, tenho o seguinte:

  this.WindowState = FormWindowState.Normal; this.Visible = true; this.ShowInTaskbar = true; 

Como eu disse, eu tentei muitas pequenas variações sobre isso (this.Hide (), etc.). Existe uma maneira de fazer com que o NotifyIcon seja o componente principal, de modo que eu possa iniciar e descartar completamente o formulário, deixando o NotifyIcon em execução? Tem que haver uma maneira de iniciar o aplicativo com o formulário minimizado sem qualquer estranheza. Por favor me ajude a encontra-lo!

O jeito certo de fazer isso é impedir que o formulário fique visível em primeiro lugar. Isso requer a substituição de SetVisibleCore (). Vamos supor um menu de contexto para o NotifyIcon com um comando Show and Exit. Você pode implementá-lo assim:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); notifyIcon1.ContextMenuStrip = contextMenuStrip1; this.showToolStripMenuItem.Click += showToolStripMenuItem_Click; this.exitToolStripMenuItem.Click += exitToolStripMenuItem_Click; } private bool allowVisible; // ContextMenu's Show command used private bool allowClose; // ContextMenu's Exit command used protected override void SetVisibleCore(bool value) { if (!allowVisible) { value = false; if (!this.IsHandleCreated) CreateHandle(); } base.SetVisibleCore(value); } protected override void OnFormClosing(FormClosingEventArgs e) { if (!allowClose) { this.Hide(); e.Cancel = true; } base.OnFormClosing(e); } private void showToolStripMenuItem_Click(object sender, EventArgs e) { allowVisible = true; Show(); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { allowClose = true; Application.Exit(); } } 

Observe um enrugamento com o evento Load, ele não será triggersdo até que o formulário principal seja exibido pela primeira vez. Portanto, certifique-se de fazer a boot no construtor do formulário, não no manipulador de events Load.

No construtor , remova essas duas linhas:

 this.Visible = false; this.ShowInTaskbar = false; 

e adicione após InitializeComponent(); :

 this.WindowState = FormWindowState.Minimized; 

No designer, defina ShowInTaskbar como false e FormWindowState como Normal .

EDIT: Se você postar o mesmo no evento Load, a janela é minimizada, mas ainda mostra minimizado na área de trabalho. Eu penso que isto é um erro.

Estou lendo todas as respostas e vejo hacks e magia negra … (sem ofensa, companheiros)

Caras, não são necessários hacks. Você nem precisa definir “ShowInTaskbar = false” e outras coisas. Apenas faça isso:

  //"Form Shown" event handler private void Form_Shown(object sender, EventArgs e) { //to minimize window this.WindowState = FormWindowState.Minimized; //to hide from taskbar this.Hide(); } 

NOTA: Eu recomendo fortemente NÃO TOCAR na propriedade “ShowInTaskbar”. Por exemplo, se seu aplicativo registra teclas de atalho do sistema ou outras coisas semelhantes (ganchos, etc) – definir ShowInTaskBar = false e minimizar seu aplicativo impedirá que o Windows envie algumas mensagens para sua janela … E seus hooks / hotkeys / etc parar de trabalhar.

Ao minimizar um aplicativo e você deseja ocultá-lo do Alt + Tab:

Você também precisa definir a Opacidade para parar a barra de título que aparece perto do Menu Iniciar quando você define o Estilo da Borda para uma Janela de Ferramenta.

No evento minimizar:

 this.Visible = false; this.Opacity = 0; this.FormBorderStyle = FormBorderStyle.FixedToolWindow; this.ShowInTaskbar = false; 

No evento normalizar:

 this.Visible = true; this.Opacity = 100; this.FormBorderStyle = FormBorderStyle.FixedSingle; //or whatever it was previously set to this.ShowInTaskbar = true; 

Essa “solução rápida e suja” funcionou para mim:

 $form1.FormBorderStyle = "fixedtoolwindow" $form1.top = -1000000 $form1.Left = -1000000 $form1.Width = 10 $form1.Height = 10 $form1.WindowState = "normal" $form1.ShowInTaskbar = $False $form1.Opacity = 0 $form1.Hide() 

Espero que isso ajude mais alguém…