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

216

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

No es una aplicación que pueda minimizar la bandeja, sino una que solo existe en la bandeja, con nada más que un ícono, información sobre herramientas y menú de "clic derecho".

xyz
fuente
99
Hay algo que falta en la mayoría de las respuestas: no olvide configurar icon.Visible = false, luego Dispose()el icono al salir de su aplicación. De lo contrario, aún verá el icono después de que su programa salga. Después de probarlo un par de veces, ya no sabrá qué icono es real.
Tomasz Gandor
Si buscas un enfoque WPF más moderno, puedes probar esto: codeproject.com/Articles/36788/…
Murray Foxcroft el

Respuestas:

85

El artículo del proyecto de código Creación de una aplicación de bandeja de tareas ofrece una explicación muy simple y un ejemplo de cómo crear una aplicación que solo existe en la bandeja del sistema.

Básicamente, cambie la Application.Run(new Form1());línea Program.cspara iniciar una clase que herede de ApplicationContext, y haga que el constructor de esa clase inicialice unNotifyIcon

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [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();
    }
}
Fawzan Izy
fuente
13
Este es un gran punto de partida. Tenga en cuenta que "AppIcon" debe ser el nombre de un recurso que agregue con "Proyecto -> Propiedades -> Recursos -> Agregar recurso", y luego vuelva a compilar el proyecto.
Lavamantis
1
Hice propiedades ... recursos ... agregue recursos ... icono ... recompilado, todavía obtengo "Error CS0103 El nombre 'Recursos' no existe en el contexto actual"
barlop
@barlop Tenía que escribirlo así: Properites.Resources.AppIcon
Simon Perepelitsa
@SimonPerepelitsa gracias, no estoy seguro de lo que hice en mis experimentos, quise comentar lo que funcionó, pero debo haber olvidado algunas de las cosas que hice que funcionaron. Pero en última instancia, el método que utilicé fue arrastrar un icono de notificación desde la paleta de cosas que puede arrastrar. Luego, haga clic en él en el formulario, haga clic en una pequeña flecha que muestra un menú para elegir un icono.
barlop
17

Como dice mat1t: debe agregar un 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 en la bandeja del sistema solamente:

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

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

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

El clic derecho para obtener el menú contextual se maneja automáticamente, pero si desea realizar alguna acción con un clic izquierdo, deberá agregar un controlador 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;
        }
    }
ChrisF
fuente
15

Escribí una aplicación de barra de bandeja con .NET 1.1 y no necesitaba un formulario.
En primer lugar, establezca el objeto de inicio del proyecto como Sub Main, definido en un módulo.
Luego cree programáticamente los componentes: el NotifyIcony ContextMenu.
Asegúrese de incluir un MenuItem"Salir" o similar.
Vincula el ContextMenua la NotifyIcon.
Invoke Application.Run().
En el controlador de eventos para Salir, MenuItemasegúrese de llamar al conjunto NotifyIcon.Visible = False, entonces Application.Exit(). Agregue lo que necesita al ContextMenuy maneje correctamente :)

M.Turrini
fuente
11
  1. Cree una nueva aplicación de Windows con el asistente.
  2. Eliminar Form1del código.
  3. Elimine el código en Program.cs iniciando el Form1.
  4. Use la NotifyIconclase para crear el icono de la bandeja del sistema (asígnele un icono).
  5. Agregue un menú contextual.
  6. O reaccione al NotifyIconclic del mouse y diferencie entre el clic derecho y el izquierdo, configurando su menú contextual y mostrándolo para cualquier botón (derecho / izquierdo) presionado.
  7. Application.Run()para mantener la aplicación funcionando Application.Exit()para salir. O a bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Luego configure bRunning = false;para salir de la aplicación.
Lobo5
fuente
El programa deja de ejecutarse cuando llega al final de Main y no tiene subproceso de interfaz de usuario. ¿Cómo se ocupa de que esta sea su solución? Si has resuelto esos problemas, obtienes mi voto :)
Matthew Steeples
Tienes mi voto. Tal vez solo mencione que aún necesita llamar a Application.Run sin ningún parámetro.
Actualizado con una alternativa a App.Run.
Wolf5
El thread.sleep es excesivo, lo sé, pero si tienes una mejor alternativa de bucle "sleep" a Application.Run, publícalo :)
Wolf5
Thread.Sleep es una mala idea: terminarás usando más CPU y batería que si solo hubieras hecho Application.Run como estás destinado.
Sneftel
8

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

Y una cosa más, con el fin de lograr la apariencia o la aplicación estándar de la bandeja. agregue líneas de seguimiento en su evento de presentación de formulario principal:

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

Hasta donde yo sé, todavía tiene que escribir la aplicación usando un formulario, pero no tiene controles en el formulario y nunca lo configura como visible. Use NotifyIcon (una muestra de MSDN que se puede encontrar aquí ) para escribir su aplicación.

Matthew Steeples
fuente
1
No exactamente. Sus formularios pueden contener controles, pero deben estar ocultos de manera predeterminada.
Rune Grimstad
55
No necesitas ninguna forma. Después de un nuevo asistente de creación de aplicaciones de Windows, simplemente elimine el Form1 y elimine el código que lo abre. Puede escribirlo todo desde Program.cs con NotifyIcon y ContextMenu en él. Nada más requerido.
Wolf5
1
Sé que puede contener controles, pero OP no quiere que sea así
Matthew Steeples
2

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

  1. Cree una aplicación de formularios Windows Forms, establezca 'Crear aplicación de instancia única' en propiedades
  2. Agregar un ContextMenuStrip
  3. Agregue algunas entradas a la tira del menú contextual, haga doble clic en ellas para obtener los controladores, por ejemplo, 'salir' (doble clic) -> controlador -> yo.Cerrar ()
  4. Agregue un NotifyIcon, en el diseñador establece contextMenuStrip al que acaba de crear, elija un icono (puede encontrar algunos en la carpeta VisualStudio en 'common7 ...')
  5. Establezca propiedades para el formulario en el diseñador: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacity: 0%, WindowState: Minimized
  6. Agregue Me.Visible = false al final de Form1_Load, esto ocultará el ícono cuando use Ctrl+Tab
  7. Ejecute y ajuste según sea necesario.
Evolucionado
fuente
2

Es un marco muy amigable para la aplicación del área de notificación ... es suficiente agregar NotificationIcon al formulario base y cambiar el código generado automáticamente al código a continuación:

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;
        }
    }
}
Sebastian Xawery Wiśniowiecki
fuente
-2

Simplemente agregue

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

a su objeto de forma. Solo verá un icono en la bandeja del sistema.

YTerle
fuente
Eso pone el formulario sobre la barra de tareas. No es lo mismo ¿Estás tratando de responder a otra publicación?
LarsTech 01 de
1
No hay un icono en la barra de tareas, no vemos el formulario. El programa visual solo existe en la bandeja del sistema. ¿Qué significa arriba ?
YTerle 01 de
Su respuesta no contiene ningún contexto. ¿Estás usando la clase NotifyIcon? Si no, su formulario se minimiza en la esquina inferior izquierda sobre la barra de tareas.
LarsTech 01 de
1
Si no está ocupado, intente escribir y ejecutarlo.
YTerle