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:
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 unSystem.Drawing.Icon, y el selector del diseñador de Visual Studio acepta archivos.icodirectamente. Otros formatos de imagen deben convertirse primero en unIconmediante código, por lo que un archivo.icosigue 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 enFalsemientras 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 muestraShowBalloonTip.
En la ventana Propiedades, asigne un archivo .ico a Icon y deje Visible establecido en False para comenzar:
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 projecten la ventana de inicio:
-
Elija la plantilla
Windows Forms Appy haga clic enNext:
-
Escriba un nombre de proyecto y haga clic en
Create:
-
Arrastre
NotifyIcondesde el Cuadro de herramientas al formulario, luego asigne suIcony dejeVisibleestablecido enFalsecomo 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
Resizedel formulario. Seleccione el formulario, abra la lista de eventos en la ventana Propiedades (el botón del rayo) y haga doble clic enResizepara crearForm1_Resize:
-
Conecte el evento
MouseDoubleClickdenotifyIcon1de la misma manera: seleccionenotifyIcon1en la bandeja de componentes, abra la lista de eventos y haga doble clic enMouseDoubleClickpara crearnotifyIcon1_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_ResizeynotifyIcon1_MouseDoubleClickenForm1.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:
En este punto, la aplicación ocupa la barra de tareas y aún no se ha agregado nada a la bandeja del sistema:
Haga clic en el botón de minimizar del formulario:
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:
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.