¿Cuál es la forma correcta de minimizar en la bandeja una aplicación C# WinForms?

StackOverflow https://stackoverflow.com/questions/46918

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Cuál es la forma correcta de minimizar una aplicación WinForms en la bandeja del sistema?

Nota:minimizar a bandeja del sistema;en el lado derecho de la barra de tareas junto al reloj.No estoy preguntando acerca de minimizar la barra de tareas, que es lo que sucede cuando presionas el botón "menos" en la ventana.

He visto soluciones pirateadas como "minimizar, configurar ShowInTaskbar = false y luego mostrar su NotifyIcon".

Soluciones como esa son hackers porque la aplicación no parece minimizarse en la bandeja como otras aplicaciones, el código tiene que detectar cuándo configurar ShowInTaskbar = true, entre otras cuestiones.

¿Cuál es la forma correcta de hacer esto?

¿Fue útil?

Solución

En realidad, no existe una forma administrada de realizar esa forma de animación en la bandeja en winforms nativos, sin embargo, puede P/Invoke shell32.dll para hacerlo:

Alguna buena información aquí (en los comentarios, no en la publicación):

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

Y aquí está en C++:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

Puedes usarlo para descubrir qué cosas Pinvoke para tu versión de C#.

Otros consejos

this.WindowState = FormWindowState.Minimized  

Esa es la forma integrada de hacerlo y me parece bien la mayor parte del tiempo.El único momento en que tiene cierta rareza es si lo llama al inicio, lo que a veces tiene algunas rarezas, por lo que la mayoría de las personas también configurarán ShowInTaskbar = false y ocultarán el formulario también.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

Ayudará:

public partial class Form1 : Form
{
    public static bool Close = false;
    Icon[] images;
    int offset = 0;

    public Form1()
    {
        InitializeComponent();

        notifyIcon1.BalloonTipText = "My application still working...";
        notifyIcon1.BalloonTipTitle = "My Sample Application";
        notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 
    }

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

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        this.Show();
        notifyIcon1.ShowBalloonTip(1000);
        WindowState = FormWindowState.Normal;
    }

    private void maximizeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Show();
        WindowState = FormWindowState.Normal;
    }

    private void closeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Close = true;
        this.Close();  
    }

    // Handle Closing of the Form.
    protected override void OnClosing(CancelEventArgs e)
    {
        if (Close)
        {
            e.Cancel = false;
        }
        else
        {
            WindowState = FormWindowState.Minimized;
            e.Cancel = true;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load the basic set of eight icons.
        images = new Icon[5];
        images[0] = new Icon("C:\\icon1.ico");
        images[1] = new Icon("C:\\icon2.ico");
        images[2] = new Icon("C:\\icon3.ico");
        images[3] = new Icon("C:\\icon4.ico");
        images[4] = new Icon("C:\\icon5.ico");
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        // Change the icon.
        // This event handler fires once every second (1000 ms).
        if (offset < 5)
        {
            notifyIcon1.Icon = images[offset];
            offset++;
        }
        else
        {
            offset = 0;
        }
    }
}

Este código está probado y admite muchas opciones.

Más aquí: http://code.msdn.microsoft.com/TheNotifyIconExample

Actualizar:Parece que publiqué demasiado pronto.También estaba usando el siguiente truco para una herramienta mía.Esperando la solución adecuada para esto..........

Puedes usar Windows.Forms.NotifyIcon para esto. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

Agregue NotifyIcon al formulario, establezca algunas propiedades y listo.

        this.ShowIcon = false;//for the main form
        this.ShowInTaskbar = false;//for the main form
        this.notifyIcon1.Visible = true;//for notify icon
        this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon

    private void Form1_Shown(object sender, EventArgs e)
    {
        this.Hide();
    }

Similar al anterior...

Tengo un controlador de eventos de cambio de tamaño que se activa cada vez que se cambia el tamaño de la ventana (maximizada, minimizada, etc.)...

    public form1()
    {
       Initialize Component();

       this.Resize += new EventHanlder(form1_Resize);
    } 


    private void form1_Resize(object sender, EventArgs e)
    {
       if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true)
       {
             NotificationIcon1.Visible = true;
             NotificationIcon1.BalloonTipText = "Tool Tip Text"
             NotificationIcon1.ShowBalloonTip(2);  //show balloon tip for 2 seconds
             NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds";
             this.WindowState = FormWindowState.Minimized;
             this.ShowInTaskbar = false;
       }
    }

Esto permite al usuario seleccionar si desea o no minimizar en la bandeja a través de una barra de menú.Pueden ir a Windows -> y hacer clic en Minimizar a la bandeja.Si esto se verifica y la ventana se redimensiona para minimizar, entonces se minimizará a la bandeja.Funciona perfectamente para mí.

En el constructor del Formulario:

this.Resize += new EventHandler(MainForm_Minimize);

Luego use este método de controlador de eventos:

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

Si tiene problemas para que esto funcione, verifique que tenga

this.Resize += new System.EventHandler(this.Form1_Resize);

en fom1.designer.cs

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top