¿Cómo iniciar la aplicación WinForm minimizada a la bandeja?

He creado con éxito una aplicación que se minimiza en la bandeja con NotifyIcon. Cuando el formulario se cierra manualmente, se oculta correctamente desde el escritorio, la barra de tareas y la pestaña alt. El problema ocurre cuando intentamos comenzar con la aplicación minimizada. Al principio, el problema era que la aplicación se minimizaría, pero seguiría apareciendo en el cuadro de diálogo alt-tab. Cambiar el FormBorderStyle a una de las opciones de ToolWindow (desde la opción “Ninguno”) lo solucionó, pero introdujo otro problema. Cuando la aplicación se inicia por primera vez, la barra de título de la ventana minimizada es visible justo arriba del menú de inicio:

enter image description here

Al abrir el formulario y cerrarlo, se oculta correctamente. He intentado muchas variaciones, pero aquí está esencialmente cómo está funcionando ahora …

WindowState está configurado como Minimizado en el Diseñador. Después de una inicialización en el constructor, tengo las siguientes líneas:

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

Cuando se hace doble clic en NotifyIcon, tengo lo siguiente:

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

Como dije, probé muchas variaciones menores sobre esto (this.Hide (), etc.). ¿Hay alguna manera de que NotifyIcon sea el componente principal, de modo que pueda iniciar y eliminar por completo el formulario mientras se ejecuta NotifyIcon? Tiene que haber una manera de iniciar la aplicación con la forma minimizada sin ninguna rareza. ¡Por favor ayúdame a encontrarlo!

La forma correcta de hacerlo es evitar que la forma se vuelva visible en primer lugar. Eso requiere anular SetVisibleCore (). Supongamos un menú de contexto para NotifyIcon con un comando Mostrar y Salir. Puedes implementarlo así:

 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 una arruga con el evento Load, no se disparará hasta que se muestre por primera vez el formulario principal. Así que asegúrese de hacer la inicialización en el constructor del formulario, no en el controlador de eventos Load.

En el constructor , elimine estas dos líneas:

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

y agregar después de InitializeComponent(); :

 this.WindowState = FormWindowState.Minimized; 

En el diseñador, configure ShowInTaskbar en false y FormWindowState en Normal .

EDITAR: si publica el mismo evento en Cargar, la ventana se minimiza pero aún se muestra minimizada en el escritorio. Creo que esto es un error.

Estoy leyendo todas las respuestas y veo hacks y magia negra … (sin ofender, compañeros)

Chicos, no se necesitan hacks. Ni siquiera necesita configurar “ShowInTaskbar = false” y otras cosas. Solo haz esto:

  //"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: Recomiendo NO TOCAR la propiedad “ShowInTaskbar”. Por ejemplo, si su aplicación registra teclas rápidas en todo el sistema u otras cosas similares (ganchos, etc.), configurar ShowInTaskBar = false y minimizar su aplicación evitará que Windows envíe algunos mensajes a su ventana … Y sus hooks / hotkeys / etc para de trabajar.

Cuando minimices una aplicación y quieras esconderla de Alt + Tab:

También debe configurar la Opacidad para detener la barra de título que se muestra cerca del menú Inicio cuando configura el estilo de borde en una ventana de herramientas.

En Minimizar evento:

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

En Evento Normalizar:

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

Esta “solución rápida y sucia” funcionó para mí:

 $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 ayude a alguien más …