2009-11-13 11 views
41

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:¿Cómo se inicia la aplicación WinForm minimizada en la bandeja?

Pic http://i38.tinypic.com/2wny811.gif.

Al abrir el formulario y al cerrarlo, se oculta correctamente. He intentado con muchas variaciones, pero aquí está esencialmente cómo está funcionando en este momento ...

WindowState está configurado en Minimizado en el Diseñador. Después de un poco de inicialización en el constructor Tengo las siguientes líneas:

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

Cuando el NotifyIcon se hace doble clic Tengo el siguiente:

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

Como he dicho, he intentado un montón de variaciones menores en 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!

Respuesta

70

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. Se puede implementar de esta manera:

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

nota una arruga con el evento de carga, no se disparará hasta que se muestra 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.

+0

Brillante, gracias! Hice algunos ajustes para que funcione con mi aplicación específica, ¡pero funciona muy bien! – jluce50

+0

Gran solución Hans, gracias. – Segfault

+0

¡Funciona como un encanto! – psulek

16

En el constructor de , eliminar estas dos líneas:

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

y añadir después InitializeComponent();:

this.WindowState = FormWindowState.Minimized; 

En el diseñador, establezca ShowInTaskbar-false & FormWindowState-Normal.

EDIT: Si publica la misma en caso de carga, la ventana se vuelve a reducirse al mínimo, pero aún muestra minimizada en el escritorio. Creo que esto es un error.

+2

O en el evento de carga del formulario, ya que el constructor es el diseñador-generado y que' es probable que su cambio desaparezca de vez en cuando. –

+0

Estoy de acuerdo, el evento de carga sería un mejor lugar – Miles

+0

Ver mi edición. Tu cambio desaparecerá solo si publicas la línea que publiqué antes de 'InitializeComponent();'. Todas las configuraciones de diseñador se cargan en 'InitializeComponent();'. – Yogesh

2

Cuando minimiza una aplicación y desea ocultarlo de Alt + Tab:

También es necesario establecer la opacidad para detener la barra de título que muestra cerca del menú de inicio cuando se establece el estilo de borde de una ventana de herramientas.

En Minimizar Evento:

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

En Normalizar Evento:

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

¡Muy bonito! Gracias. – Damien

12

estoy leyendo todas las respuestas y ver los cortes y la magia negro ... (sin ánimo de ofender, compañeros)

Chicos, no se necesitan hacks. Ni siquiera necesita configurar "ShowInTaskbar = false" y otras cosas. Sólo hacer 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: que recomendamos 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.

+0

¿Esto mostrará el icono en la bandeja como solicitó el OP? – WEFX

+0

Estaba investigando sobre cómo hacer esto para mi programa y esta respuesta fue la manera más simple y efectiva de lograr mi objetivo. – Brad

+0

@Brad no, aún necesita agregar NotifyIcon manualmente. pero hará el truco después de que tenga el ícono agregado. – user2404597

0

Esta "solución rápida y sucia" que 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 otra persona ...

+0

¿Qué idioma es ese? – LarsTech

Cuestiones relacionadas