Qual é a maneira correta de minimizar a bandeja de um aplicativo C # WinForms?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Qual é a maneira correta de minimizar um aplicativo WinForms na bandeja do sistema?

Observação:minimizar para bandeja do sistema;no lado direito da barra de tarefas perto do relógio.Não estou perguntando sobre minimizar a barra de tarefas, que é o que acontece quando você clica no botão “menos” na janela.

Já vi soluções hackeadas como "minimizar, definir ShowInTaskbar = false e mostrar seu NotifyIcon".

Soluções como essa são hackeadas porque o aplicativo não parece minimizar na bandeja como outros aplicativos, o código precisa detectar quando definir ShowInTaskbar = true, entre outros problemas.

Qual é a maneira correta de fazer isso?

Foi útil?

Solução

Na verdade, não existe uma maneira gerenciada de fazer essa forma de animação na bandeja em winforms nativos, mas você pode P/Invoke shell32.dll para fazer isso:

Algumas boas informações aqui (nos comentários, não na postagem):

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

E aqui está em C++:

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

Você pode usar isso para descobrir o que Pinvoke para sua versão C#.

Outras dicas

this.WindowState = FormWindowState.Minimized  

Essa é a maneira integrada de fazer isso e parece boa para mim na maioria das vezes.A única vez que há alguma estranheza é se você chamá-lo na inicialização, o que às vezes tem alguma estranheza, e é por isso que a maioria das pessoas também definirá ShowInTaskbar = false e ocultará o formulário também.

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

Isso ajudará:

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 foi testado e oferece suporte a muitas opções.

Mais aqui: http://code.msdn.microsoft.com/TheNotifyIconExample

Atualizar:Parece que postei muito cedo.Eu também estava usando o hack abaixo para uma ferramenta minha.Esperando pela solução certa para isso..........

Você pode usar Windows.Forms.NotifyIcon para isso. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

Adicione NotifyIcon ao formulário, defina algumas propriedades e pronto.

        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();
    }

Semelhante ao acima...

Eu tenho um manipulador de eventos de redimensionamento que é acionado sempre que a janela é redimensionada (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;
       }
    }

Isso permite que o usuário selecione se deseja ou não minimizar a bandeja por meio de uma barra de menu.Eles podem ir para Windows -> e clicar em Minimizar para Bandeja.Se isso for verificado e a janela estiver sendo redimensionada para minimizada, minimizará a bandeja.Funciona perfeitamente para mim.

No construtor do Form:

this.Resize += new EventHandler(MainForm_Minimize);

Em seguida, use este método do manipulador de eventos:

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

Se você estiver tendo problemas para fazer isso funcionar, verifique se você tem

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

no fom1.designer.cs

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top