¿Cómo puedo hacer una aplicación .NET Windows Forms que solo se ejecuta en la bandeja del sistema?

¿Qué debo hacer para que una aplicación de Windows Forms se ejecute en la bandeja del sistema?

No es una aplicación que se puede minimizar en la bandeja, sino una que solo existe en la bandeja, con nada más que un icono, una herramienta y un menú de “clic derecho”.

La respuesta básica de usar NotifyIcon es correcta, pero, como muchas cosas .NET, hay una gran cantidad de sutilezas involucradas en hacerlo bien . El tutorial mencionado por Brad ofrece un buen repaso de los conceptos básicos, pero no aborda ninguno de estos:

  • ¿El cierre de la aplicación desde la bandeja del sistema cierra correctamente todos los formularios secundarios abiertos?
  • ¿La aplicación exige que solo se ejecute una instancia de sí mismo (aplicable a la mayoría, aunque no a todas, las aplicaciones de bandeja)?
  • Cómo abrir ventanas secundarias de WPF, así como ventanas secundarias WinForms, si lo desea.
  • Cómo admitir menús contextuales dynamics.
  • El NotifyIcon estándar existe en el espacio de WinForms; ¿Puedo hacer una solución pura de WPF? (¡Sí tu puedes!)

Acabo de publicar un artículo en Simple-Talk.com que aborda estos puntos y más en gran detalle, proporcionando un marco de aplicación de bandeja que puede usar inmediatamente, además de una aplicación de ejemplo completa y real para mostrar todo en la práctica. Consulte Creación de aplicaciones de bandejas en .NET: A Practical Guide , publicado en noviembre de 2010.

El artículo del proyecto de código Crear una aplicación Tasktray ofrece una explicación muy simple y un ejemplo de creación de una aplicación que solo existe en la Bandeja del sistema.

Básicamente cambie Application.Run(new Form1()); línea en Program.cs para en su lugar iniciar una clase que hereda de ApplicationContext , y hacer que el constructor de esa clase inicialice NotifyIcon

 static class Program { ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MyCustomApplicationContext()); } } public class MyCustomApplicationContext : ApplicationContext { private NotifyIcon trayIcon; public MyCustomApplicationContext () { // Initialize Tray Icon trayIcon = new NotifyIcon() { Icon = Resources.AppIcon, ContextMenu = new ContextMenu(new MenuItem[] { new MenuItem("Exit", Exit) }), Visible = true }; } void Exit(object sender, EventArgs e) { // Hide tray icon, otherwise it will remain shown until user mouses over it trayIcon.Visible = false; Application.Exit(); } } 

Como dice Mat1t, debe agregar NotifyIcon a su aplicación y luego usar algo como el siguiente código para configurar la información sobre herramientas y el menú contextual:

 this.notifyIcon.Text = "This is the tooltip"; this.notifyIcon.ContextMenu = new ContextMenu(); this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method))); 

Este código muestra el ícono solo en la bandeja del sistema:

 this.notifyIcon.Visible = true; // Shows the notify icon in the system tray 

Lo siguiente será necesario si tiene un formulario (por la razón que sea):

 this.ShowInTaskbar = false; // Removes the application from the taskbar Hide(); 

El clic derecho para obtener el menú contextual se maneja automáticamente, pero si quiere hacer algo con un clic izquierdo, necesitará agregar un manejador de Click:

  private void notifyIcon_Click(object sender, EventArgs e) { var eventArgs = e as MouseEventArgs; switch (eventArgs.Button) { // Left click to reactivate case MouseButtons.Left: // Do your stuff break; } } 

He escrito una aplicación traybar con .NET 1.1 y no necesitaba un formulario.
En primer lugar, configure el objeto de inicio del proyecto como un Sub Main , definido en un módulo.
Luego crea programáticamente los componentes: NotifyIcon y ContextMenu .
Asegúrese de incluir un MenuItem “Salir” o similar.
Enlace el ContextMenu al NotifyIcon .
Invocar Application.Run() .
En el controlador de eventos para Quit MenuItem asegúrese de llamar al conjunto NotifyIcon.Visible = False , luego Application.Exit() . Agregue lo que necesita al ContextMenu y maneje correctamente 🙂

  1. Cree una nueva aplicación de Windows con el asistente.
  2. Eliminar Form1 del código.
  3. Elimine el código en Program.cs que inicia Form1 .
  4. Use la clase NotifyIcon para crear el icono de la bandeja del sistema (asigne un ícono).
  5. Agregue un menú contextual a él.
  6. O reaccione al mouseclick de NotifyIcon y diferencie entre los clics derecho e izquierdo, configurando su menú contextual y mostrándolo para cual botón (derecha / izquierda) fue presionado.
  7. Application.Run() para mantener la aplicación ejecutándose con Application.Exit() para salir. O un while(bRunning){Application.DoEvents;Thread.Sleep(10);} . Luego configure bRunning = false para salir de la aplicación.

La aplicación “Bandeja del sistema” es solo una aplicación de formularios para ganar, solo la diferencia es que crea un icono en el área de la bandeja del sistema de Windows. Para crear el icono de sys.tray use el componente NotifyIcon, puede encontrarlo en la Caja de herramientas (controles comunes) y modificar sus propiedades: Icono, información sobre herramientas. También le permite manejar el clic del mouse y hacer doble clic en los mensajes.

Y una cosa más, para lograr apariencia y sensación o aplicación de bandeja estándar. agregue líneas siguientes en su evento de show de formulario principal:

 private void MainForm_Shown(object sender, EventArgs e) { WindowState = FormWindowState.Minimized; Hide(); } 

Por lo que sé, debes escribir la aplicación usando un formulario, pero no tienes controles en el formulario y nunca lo hagas visible. Use NotifyIcon (se puede encontrar una muestra de MSDN aquí ) para escribir su aplicación.

Así es como lo hice con Visual Studio 2010 , .NET 4

  1. Cree una aplicación de Windows Forms, establezca ‘Hacer aplicación de instancia única’ en las propiedades
  2. Agregar un ContextMenuStrip
  3. Agregue algunas entradas a la tira de menú contextual, haga doble clic en ellas para obtener los controladores, por ejemplo, ‘salir’ (doble clic) -> controlador -> me.Close ()
  4. Agregue NotifyIcon, en el conjunto de diseñadores contextMenuStrip al que acaba de crear, elija un icono (puede encontrar algunos en la carpeta VisualStudio bajo ‘common7 …’)
  5. Establecer propiedades para el formulario en el diseñador: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacity: 0%, WindowState: Minimized
  6. Agregar Me.Visible = false al final de Form1_Load, esto ocultará el icono cuando se usa Ctrl + Tab
  7. Ejecutar y ajustar según sea necesario.

Es un marco muy amigable para la aplicación del área de notificación … basta con agregar NotificationIcon a la forma base y cambiar el código generado automáticamente por el siguiente código:

 public partial class Form1 : Form { private bool hidden = false; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.ShowInTaskbar = false; //this.WindowState = FormWindowState.Minimized; this.Hide(); hidden = true; } private void notifyIcon1_Click(object sender, EventArgs e) { if (hidden) // this.WindowState == FormWindowState.Minimized) { // this.WindowState = FormWindowState.Normal; this.Show(); hidden = false; } else { // this.WindowState = FormWindowState.Minimized; this.Hide(); hidden = true; } } } 

Simplemente agregue

 this.WindowState = FormWindowState.Minimized; this.ShowInTaskbar = false; 

a su objeto de formulario. Verá solo un icono en la bandeja del sistema.