HOWTO · Csharp

Minimizar aplicaciones en la bandeja del sistema

Este artículo describe cómo minimizar las aplicaciones de Windows Forms en la bandeja del sistema usando C#.

En esta página

Este artículo explica cómo minimizar una aplicación de Windows Forms en la bandeja del sistema en lugar de la barra de tareas usando C#, de modo que la aplicación siga ejecutándose en segundo plano mientras permanece accesible a través de un pequeño icono en la bandeja.

Por qué minimizar una aplicación de Windows Forms en la bandeja del sistema

Windows Forms es el marco de GUI de escritorio integrado en .NET. Sus controles (botones, menús, campos de texto, casillas de verificación, etc.) se encuentran en el espacio de nombres System.Windows.Forms, y un formulario de registro o de inicio de sesión es un ejemplo típico de lo que se puede crear con él. Puede encontrar más información sobre las aplicaciones de Windows Forms aquí.

De forma predeterminada, al minimizar una aplicación de Windows Forms su botón permanece en la barra de tareas. Esto está bien para las aplicaciones a las que cambia con frecuencia, pero un programa que solo necesita ejecutarse en segundo plano desperdicia espacio en la barra de tareas, que se llena rápidamente y se vuelve difícil de navegar.

La bandeja del sistema —el área de notificación en la esquina inferior derecha de la barra de tareas— es el lugar habitual para este tipo de aplicaciones. Cada aplicación en segundo plano se representa con un pequeño icono: fuera de la vista, pero aún a un clic de distancia. Los clientes de chat y el software antivirus suelen funcionar así, y una aplicación en la bandeja aún puede notificar al usuario con un globo de información cuando algo necesita atención.

En resumen, NotifyIcon permite que una aplicación de Windows Forms se minimice en la bandeja del sistema en lugar de la barra de tareas mientras sigue ejecutándose. El resto de este artículo muestra cómo configurar ese comportamiento.

Configurar NotifyIcon

NotifyIcon es un componente del espacio de nombres System.Windows.Forms que dibuja y administra el icono que su aplicación muestra en la bandeja del sistema. No es un control visible: cuando lo arrastra a un formulario, se ubica en la bandeja de componentes debajo del diseñador en lugar de en la superficie del formulario.

En Visual Studio, abra el Cuadro de herramientas y haga doble clic o arrastre NotifyIcon al formulario:

Cuadro de herramientas de Visual Studio con el componente NotifyIcon seleccionado

Esto agrega un componente notifyIcon1 al formulario. Las propiedades importantes para este tutorial son:

  • Icon: el icono que se muestra en la bandeja del sistema —la propiedad más importante. Acepta un System.Drawing.Icon, y el selector del diseñador de Visual Studio acepta archivos .ico directamente. Otros formatos de imagen deben convertirse primero en un Icon mediante código, por lo que un archivo .ico sigue siendo la opción práctica para la bandeja.
  • Text: la información sobre herramientas que se muestra cuando el cursor se desplaza sobre el icono de la bandeja.
  • Visible: indica si el icono aparece en la bandeja. Manténgalo en False mientras el formulario esté visible para que la aplicación no ocupe la barra de tareas y la bandeja al mismo tiempo.
  • BalloonTipTitle, BalloonTipText, BalloonTipIcon: el título, el texto del cuerpo y el icono de gravedad de la notificación de globo que muestra ShowBalloonTip.

En la ventana Propiedades, asigne un archivo .ico a Icon y deje Visible establecido en False para comenzar:

Propiedades de NotifyIcon con un icono asignado y Visible establecido en False

Luego establezca las propiedades de texto cuando se cargue el formulario. En el controlador Form1_Load, asigne notifyIcon1.BalloonTipTitle = "System Tray", notifyIcon1.BalloonTipText = "Some Notification" y notifyIcon1.Text = "System Tray App". El programa ejecutable de la siguiente sección muestra el método Form1_Load completo en contexto.

La lista completa de miembros está documentada en la referencia de la API de NotifyIcon.

Ocultar y restaurar el formulario

Aquí está el procedimiento paso a paso. Los tres controladores —Form1_Load, Form1_Resize y notifyIcon1_MouseDoubleClick— son miembros de la clase parcial Form1 que el diseñador de Visual Studio conecta a los eventos; se compilan y ejecutan dentro de un proyecto de Windows Forms en Windows, no como un programa independiente.

  • Abra Visual Studio y seleccione Create a new project en la ventana de inicio:

    Ventana de inicio de Visual Studio

  • Elija la plantilla Windows Forms App y haga clic en Next:

    Cuadro de diálogo Crear un nuevo proyecto con la plantilla Windows Forms App

  • Escriba un nombre de proyecto y haga clic en Create:

    Asignación de nombre al nuevo proyecto de Windows Forms

  • Arrastre NotifyIcon desde el Cuadro de herramientas al formulario, luego asigne su Icon y deje Visible establecido en False como se describe en la sección anterior. Si omite el icono, no aparecerá nada en la bandeja del sistema cuando el formulario se oculte.
  • Conecte el evento Resize del formulario. Seleccione el formulario, abra la lista de eventos en la ventana Propiedades (el botón del rayo) y haga doble clic en Resize para crear Form1_Resize:

    Lista de eventos de Form1 con Resize conectado a Form1_Resize

  • Conecte el evento MouseDoubleClick de notifyIcon1 de la misma manera: seleccione notifyIcon1 en la bandeja de componentes, abra la lista de eventos y haga doble clic en MouseDoubleClick para crear notifyIcon1_MouseDoubleClick.
  • Complete los tres controladores. Se muestran en contexto en el programa ejecutable a continuación: en Visual Studio, pegue solo los métodos Form1_Load, Form1_Resize y notifyIcon1_MouseDoubleClick en Form1.cs.

Como los controladores dependen de tipos de System.Windows.Forms que solo existen dentro de un proyecto de Windows Forms, el programa siguiente los envuelve en pequeños tipos sustitutos (FormWindowState, MouseEventArgs, NotifyIcon) con los mismos nombres de miembros para que se compile y ejecute por sí solo. Main desempeña el papel del usuario: minimiza la ventana, deja que Resize reaccione y luego hace doble clic en el icono de la bandeja. El programa se reproduce a continuación sin cambios, en inglés: las cadenas que imprime —“Form hidden”, el globo “Balloon tip: System Tray - Some Notification” y “Form shown”— corresponden a ocultar el formulario, mostrar la notificación y restaurarlo. Ejecute este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

using System;

// Minimal stand-ins so the handler logic compiles and runs as a plain
// console program. In a real project these types come from
// System.Windows.Forms and the handlers live in the Form1 partial class.
enum FormWindowState { Normal, Minimized }

class MouseEventArgs { }

class NotifyIcon
{
    public bool Visible;
    public string Text;
    public string BalloonTipTitle;
    public string BalloonTipText;

    public void ShowBalloonTip(int timeout)
    {
        Console.WriteLine("Balloon tip: " + BalloonTipTitle + " - " + BalloonTipText);
    }
}

class Form1
{
    FormWindowState WindowState = FormWindowState.Normal;
    NotifyIcon notifyIcon1 = new NotifyIcon();

    void Hide() { Console.WriteLine("Form hidden"); }
    void Show() { Console.WriteLine("Form shown"); }

    private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipTitle = "System Tray";
        notifyIcon1.BalloonTipText = "Some Notification";
        notifyIcon1.Text = "System Tray App";
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            this.Hide();
            notifyIcon1.Visible = true;
            notifyIcon1.ShowBalloonTip(1000);
        }
        else if (FormWindowState.Normal == this.WindowState)
        {
            notifyIcon1.Visible = false;
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        this.Show();
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }

    static void Main()
    {
        Form1 form = new Form1();
        form.Form1_Load(null, new EventArgs());
        form.WindowState = FormWindowState.Minimized;
        form.Form1_Resize(null, new EventArgs());
        form.notifyIcon1_MouseDoubleClick(null, null);
        form.Form1_Resize(null, new EventArgs());
    }
}
Form hidden
Balloon tip: System Tray - Some Notification
Form shown

Resize se activa cada vez que cambia WindowState, por lo que es el lugar correcto para reaccionar a la minimización. this.Hide() elimina por completo el botón del formulario de la barra de tareas; una minimización simple solo lo reduciría allí. Hacer el icono Visible y llamar a ShowBalloonTip anuncia el cambio; el argumento 1000 es el tiempo de visualización del globo en milisegundos. La rama else if vuelve a ocultar el icono cada vez que la ventana regresa a Normal, lo que también cubre las restauraciones que no provienen del icono de la bandeja.

En el controlador de restauración, this.Show() recupera el formulario oculto, WindowState = FormWindowState.Normal lo desminimiza y el icono se oculta de nuevo ahora que el formulario tiene su botón en la barra de tareas.

Probar el comportamiento de la bandeja del sistema

Ejecute la aplicación (F5). Aparece la ventana vacía Form1:

La ventana de Form1 en ejecución

En este punto, la aplicación ocupa la barra de tareas y aún no se ha agregado nada a la bandeja del sistema:

Barra de tareas que muestra el botón de la aplicación antes de minimizar

Haga clic en el botón de minimizar del formulario:

Form1 con el botón de minimizar resaltado

El controlador Form1_Resize se activa: el formulario y su botón en la barra de tareas desaparecen, el icono aparece en la bandeja del sistema y el globo de información emerge con el título y el texto configurados, la misma secuencia que el programa ejecutable anterior imprime como sus tres líneas de salida:

Bandeja del sistema que muestra el icono de la aplicación después de minimizar

Haga doble clic en el icono de la bandeja para confirmar la ruta de restauración: el formulario reaparece en su estado normal, su botón regresa a la barra de tareas y el icono de la bandeja desaparece. La aplicación sigue ejecutándose todo el tiempo: minimizar a la bandeja solo cambia dónde se muestra, no si se ejecuta.

Si el icono nunca aparece después de minimizar, verifique que Icon se haya asignado en el diseñador o en el código. NotifyIcon no dibuja nada (y ShowBalloonTip no muestra nada) sin un icono, lo que deja la aplicación oculta ejecutándose sin una forma visible de restaurarla.