minimizar la aplicación en la bandeja del sistema

114

Tengo una aplicación de formularios de Windows con tecnología de C # y Visual Studio 2010.

¿Cómo puedo minimizar mi aplicación en la bandeja del sistema (no en la barra de tareas) y luego traerla de vuelta cuando hago doble clic en la bandeja del sistema? ¿alguna idea? Además, ¿cómo puedo hacer un menú en el ícono en la bandeja del sistema y cuando hago clic derecho en él, muestra un menú como Iniciar sesión, Desconectar, Conectar, algo así? Además, ¿hay algún método para mostrar como un globo que aparece en la bandeja del sistema?

PD: Ya agregué un notifyIcon, pero no sé cómo usarlo.

Lo quiero
fuente
Aquí puede descargar un gran código de muestra simple-talk.com/dotnet/.net-framework/…
Desarrollador
Usted querrá asegurarse de ir al Designer.cs del formulario y "registrar" el controlador de eventos o ninguno de estos funcionará (no pude averiguarlo). Puede hacer esto agregando algo como esto: this.Resize + = new System.EventHandler (this.ManagementForm_Resize);
Brad

Respuestas:

149

Controle el evento Resize del formulario. En este controlador, anula la funcionalidad básica del evento Resize para que el formulario se minimice en la bandeja del sistema y no en la barra de tareas. Esto se puede hacer haciendo lo siguiente en el controlador de eventos Resize de su formulario: Compruebe si la propiedad WindowState del formulario está establecida en FormWindowState.Minimized. En caso afirmativo, oculte su formulario, habilite el objeto NotifyIcon y muestre la sugerencia de globo que muestra cierta información. Una vez que WindowState se convierte en FormWindowState.Normal, deshabilite el objeto NotifyIcon estableciendo su propiedad Visible en false. Ahora, desea que la ventana vuelva a aparecer cuando haga doble clic en el objeto NotifyIcon en la barra de tareas. Para ello, controle el evento MouseDoubleClick de NotifyIcon. Aquí, muestra el formulario utilizando el método Show ().

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}
DISCOS COMPACTOS..
fuente
5
puede cambiar la propiedad Form.FormBorderStyle msdn.microsoft.com/en-us/library/…
CD ..
tnx! funcionó .. también alguna idea para deshabilitar esos botones de minimizar, cerrar, maximizar en la parte superior derecha? tnx
WantIt
tnx ¡también funcionó! Además, cuando hago doble clic en el icono en la bandeja del sistema, la ventana no está en la parte superior con otras aplicaciones, tengo que esforzarme haciendo clic en la ventana en la barra de tareas para que aparezca. ¿Cómo podemos manejar esto? tnx tanto
WantIt
69

Encontré esto para lograr la solución completa. La respuesta anterior no elimina la ventana de la barra de tareas.

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

También es bueno establecer las siguientes propiedades del control del icono de notificación mediante el diseñador de formularios.

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't think there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";
Ben Gripka
fuente
7
Te perdiste this.Show();antesthis.WindowState = FormWindowState.Normal;
developerwjk
1
Error tipográfico en "el usuario no piensa". ;)
Andrew
1
@developerwjk, no falta porque no está llamando Hide(). Pero el problema con ese enfoque es que la ventana aún aparece cuando presionas Alt-Tab. Prefiero llamar Hide()y de esa manera no tienes que usar la ShowInTaskbarpropiedad en absoluto.
Andrew
@Andrew Tengo problemas al usar Show()y Hide(); después de esconderse, mostrar y luego esconderse, no se volverá a mostrar.
novato
@newbieguy, supongo que necesita crear una nueva pregunta, ya que su problema no es adecuado para un comentario sobre una respuesta. Deberá proporcionar más información, como el código que está utilizando. Puede incluir un enlace a la respuesta que intentó utilizar.
Andrew
17

Yo iria con

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

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
     this.Show();
     this.WindowState = FormWindowState.Normal;
}
Alejandro del Río
fuente
17

no olvide agregar el archivo de icono a su notifyIcon o no aparecerá en la bandeja.

ewwink
fuente
la parte más necesaria del tema. ¿Puedes agregar un poco más de información, cómo forzarlo a usar el ícono predeterminado?
T.Todua
12

prueba esto

 private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipText = "Application Minimized.";
        notifyIcon1.BalloonTipTitle = "test";
    }

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

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ShowInTaskbar = true;
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }
Tanmay Nehete
fuente
1
Si simplemente se oculta de la barra de tareas en lugar de llamar this.Hide(), la ventana seguirá apareciendo al hacer Alt-Tab.
Andrew
3

Este es el método que utilizo en mis aplicaciones, es bastante simple y se explica por sí mismo, pero me complace dar más detalles en respuesta a sus comentarios.

    public Form1()
    {
        InitializeComponent();

        // When window state changed, trigger state update.
        this.Resize += SetMinimizeState;

        // When tray icon clicked, trigger window state change.       
        systemTrayIcon.Click += ToggleMinimizeState;
    }      

    // Toggle state between Normal and Minimized.
    private void ToggleMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;
        this.WindowState = (isMinimized) ? FormWindowState.Normal : FormWindowState.Minimized;
    }

    // Show/Hide window and tray icon to match window state.
    private void SetMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;

        this.ShowInTaskbar = !isMinimized;           
        systemTrayIcon.Visible = isMinimized;
        if (isMinimized) systemTrayIcon.ShowBalloonTip(500, "Application", "Application minimized to tray.", ToolTipIcon.Info);
    }
Avispa
fuente
2
Esta y otras soluciones tienen un problema: si el formulario está oculto en otras ventanas, lo más probable es que el usuario no quiera minimizarlo al hacer clic en el icono. En cambio, debería estar enfocado. Vea mi pregunta aquí: stackoverflow.com/questions/36797442/…
maf-soft
1

Al hacer clic en la imagen en la bandeja del sistema, puede verificar si el marco es visible y luego debe establecer Visible = verdadero o falso

Lorenzo Sogliani
fuente
1

... y para el menú de notificación del botón derecho, agregue un menú contextual al formulario y edítelo y configure los eventos de clic del mouse para cada uno de los elementos del menú contextual haciendo doble clic en ellos y luego adjúntelo al icono de notificación1 seleccionando la propiedad ContextMenuStrip en el icono de notificación.

Ryu
fuente
-2

this.WindowState = FormWindowState.Minimized;

Hasala Senevirathne
fuente