c# - controles - ¿Cómo puedo crear una aplicación.NET Windows Forms que solo se ejecuta en la bandeja del sistema?
agregar controles dinamicamente c# (10)
¿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 pueda minimizar en la bandeja, sino una que existe solo en la bandeja, con nada más que un icono, información sobre herramientas y el menú "clic derecho".
- Crear una nueva aplicación de Windows con el asistente.
- Eliminar
Form1
del código. - Elimine el código en Program.cs iniciando el
Form1
. - Use la clase
NotifyIcon
para crear el icono de la bandeja del sistema (asígnele un icono). - Añade un menú contextual a él.
- O reaccione ante el clic del botón de
NotifyIcon
y haga una diferencia entre hacer clic con el botón derecho e izquierdo, configurando su menú de contexto y mostrándolo para cada botón (derecho / izquierdo) presionado. -
Application.Run()
para mantener la aplicación ejecutándose conApplication.Exit()
para salir. O unwhile(bRunning){Application.DoEvents;Thread.Sleep(10);}
. A continuación, establezcabRunning = false
para salir de la aplicación.
Así es como lo hice con Visual Studio 2010 , .NET 4
- Cree una aplicación de Windows Forms, establezca ''Crear aplicación de instancia única'' en las propiedades
- Añadir un ContextMenuStrip
- Agregue algunas entradas a la tira del menú contextual, haga doble clic en ellas para obtener los controladores, por ejemplo, ''salir'' (doble clic) -> controlador -> me.Close ()
- Agregue un NotifyIcon, en el juego de diseño contextMenuStrip al que acaba de crear, elija un icono (puede encontrar alguno en la carpeta VisualStudio en ''common7 ...'')
- Establezca las propiedades para el formulario en el diseñador: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacidad: 0%, WindowState: Minimizado
- Agregar Me.Visible = falso al final de Form1_Load, esto ocultará el ícono al usar Ctrl + Tab
- Ejecutar y ajustar según sea necesario.
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 de clic:
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;
}
}
El artículo del proyecto de código codeproject.com/Articles/18683/Creating-a-Tasktray-Application ofrece una explicación muy sencilla y un ejemplo de cómo crear una aplicación que solo existe en la bandeja del sistema.
Básicamente cambia la Application.Run(new Form1());
línea en Program.cs
para iniciar una clase que hereda de ApplicationContext
y hacer que el constructor de esa clase inicie un NotifyIcon
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();
}
}
Es un marco muy amigable para la aplicación del área de notificación ... es suficiente para agregar NotificationIcon a la forma básica 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;
}
}
}
Escribí una aplicación de la barra de tareas 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: NotifyIcon
y ContextMenu
.
Asegúrese de incluir un elemento de MenuItem
"Salir" o similar.
Enlace el ContextMenu
al NotifyIcon
.
Invoque Application.Run()
.
En el controlador de eventos para Salir de MenuItem
asegúrese de llamar al conjunto NotifyIcon.Visible = False
, luego a Application.Exit()
. Agregue lo que necesite al ContextMenu
y maneje adecuadamente :)
La aplicación de la "bandeja del sistema" es solo una aplicación regular de formularios ganadores, la única diferencia es que crea un icono en el área de la bandeja del sistema de Windows. Para crear el ícono sys.tray con el componente NotifyIcon, puede encontrarlo en la Caja de herramientas (controles comunes) y modificar sus propiedades: Ícono, información sobre herramientas. También le permite manejar los mensajes de clic del ratón y doble clic.
Y una cosa más, para lograr la apariencia o la aplicación de bandeja estándar. Agregue las siguientes líneas en el formulario principal de su evento:
private void MainForm_Shown(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
Hide();
}
La respuesta básica de usar un NotifyIcon es correcta pero, como muchas otras cosas .NET, hay una serie de sutilezas involucradas en hacerlo bien . El tutorial mencionado por Brad ofrece una buena descripción de los conceptos básicos, pero no aborda ninguno de estos:
- ¿Al cerrar la aplicación desde la bandeja del sistema, se cierran correctamente los formularios secundarios abiertos?
- ¿La aplicación exige que solo se ejecute una instancia de sí misma (aplicable a la mayoría de las aplicaciones de bandeja, aunque no a todas)?
- Cómo abrir ventanas secundarias WPF así como ventanas secundarias WinForms, si lo desea.
- Cómo soportar menús contextuales dinámicos.
- 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 con gran detalle, que proporciona un marco de aplicación de bandeja que puede utilizar de inmediato, además de una aplicación de ejemplo completa y del mundo real para mostrar todo en la práctica. Consulte Creación de aplicaciones de bandeja en .NET: una guía práctica , publicada en noviembre de 2010.
Por lo que yo sé, todavía tiene que escribir la aplicación utilizando un formulario, pero no tiene controles en el formulario y nunca lo haga visible. Use NotifyIcon (una muestra de MSDN de la cual se puede encontrar here ) para escribir su aplicación.
Simplemente añada
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
a su objeto de formulario. Verás solo un icono en la bandeja del sistema.