minimizar o aplicativo para a bandeja do sistema

114

Eu tenho um aplicativo de formulários do Windows com tecnologia C # e Visual Studio 2010.

Como posso minimizar meu aplicativo na bandeja do sistema (não na barra de tarefas) e trazê-lo de volta ao clicar duas vezes na bandeja do sistema? qualquer ideia? também, como posso fazer algum menu no ícone na bandeja do sistema e quando clico com o botão direito nele, ele mostra um menu como Login, Desconectar, Conectar, algo assim. Além disso, há algum método para mostrar um balão aparecendo na bandeja do sistema?

PS: Eu já adicionei o notiocon, mas não sei como usá-lo.

Eu quero isso
fonte
Aqui você pode baixar um ótimo código de amostra simple-talk.com/dotnet/.net-framework/…
Desenvolvedor
Você vai querer ter certeza de entrar no Designer.cs do formulário e "registrar" o manipulador de eventos ou nada disso funcionará (não consegui descobrir). Você pode fazer isso adicionando algo como este: this.Resize + = new System.EventHandler (this.ManagementForm_Resize);
Brad

Respostas:

149

Manipule o evento Resize do formulário. Neste manipulador, você substitui a funcionalidade básica do evento Resize para minimizar o formulário na bandeja do sistema e não na barra de tarefas. Isso pode ser feito da seguinte maneira no manipulador de eventos Resize do formulário: Verifique se a propriedade WindowState do formulário está definida como FormWindowState.Minimized. Em caso afirmativo, oculte seu formulário, ative o objeto NotifyIcon e mostre a dica em balão que mostra algumas informações. Assim que WindowState se tornar FormWindowState.Normal, desative o objeto NotifyIcon definindo sua propriedade Visible como false. Agora, você deseja que a janela reapareça ao clicar duas vezes no objeto NotifyIcon na barra de tarefas. Para isso, manipule o evento MouseDoubleClick do NotifyIcon. Aqui, você mostra o formulário usando o 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;
    }
}
CD..
fonte
5
você pode alterar a propriedade Form.FormBorderStyle msdn.microsoft.com/en-us/library/…
CD ..
tnx! funcionou .. também alguma ideia de desabilitar aqueles botões minimizar, fechar, maximizar no canto superior direito? tnx
WantIt,
tnx funcionou também! Além disso, quando clico duas vezes no ícone na bandeja do sistema, a janela não está na parte superior com outros aplicativos, tenho que fazer um esforço clicando na janela na barra de tarefas para que ela apareça. Como podemos lidar com isso? tnx so much
WantIt,
69

Eu encontrei isso para realizar toda a solução. A resposta acima não remove a janela da barra de tarefas.

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

Também é bom definir as seguintes propriedades do controle do ícone de notificação usando o designer de formulários.

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
fonte
7
Você está desaparecido this.Show();antesthis.WindowState = FormWindowState.Normal;
developerwjk
1
Digite "o usuário não faz nada". ;)
Andrew
1
@developerwjk, não está faltando porque ele não está ligando Hide(). Mas o problema com essa abordagem é que a janela ainda aparece quando você pressiona Alt-Tab. Prefiro ligar Hide()e assim você não precisa mais usar o ShowInTaskbarimóvel.
Andrew
@Andrew Estou tendo problemas ao usar Show()e Hide(); depois de se esconder, mostrar e depois se esconder, ele não aparecerá novamente.
newbieguy
@newbieguy, acho que você precisa criar uma nova pergunta, pois seu problema não é adequado para um comentário sobre uma resposta. Você precisará fornecer mais informações, conforme o código que está usando. Você pode incluir um link para a resposta que tentou usar.
Andrew
17

Eu iria com

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
fonte
17

não se esqueça de adicionar o arquivo do ícone ao seu notIcon ou ele não aparecerá na bandeja.

ewwink
fonte
a parte mais necessária do tópico. Você pode adicionar um pouco mais de informação, como forçá-lo a usar o ícone padrão?
T.Todua
12

tente isso

 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
fonte
1
Se você apenas se esconder da barra de tarefas em vez de chamar this.Hide(), a janela ainda aparecerá ao fazer Alt-Tab.
Andrew
3

Este é o método que utilizo em minhas aplicações, é bastante simples e autoexplicativo, mas fico feliz em dar mais detalhes em resposta aos seus comentários.

    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);
    }
Vespa
fonte
2
Esta e outras soluções têm um problema: se o formulário estiver oculto sob outras janelas, o usuário provavelmente não deseja minimizá-lo ao clicar no ícone. Em vez disso, deve ser focado. Veja minha pergunta aqui: stackoverflow.com/questions/36797442/…
maf-soft
1

Ao clicar na imagem na bandeja do sistema, você pode verificar se o quadro está visível e então você deve definir Visible = true ou false

Lorenzo Sogliani
fonte
1

... e para o seu menu de notificação de clique com o botão direito, adicione um menu de contexto ao formulário e edite-o e defina eventos de clique do mouse para cada um dos contextmenuitems clicando duas vezes neles e, em seguida, anexe-o ao notiicon1 selecionando o ContextMenuStrip na propriedade notificicon.

Ryu
fonte
-2

this.WindowState = FormWindowState.Minimized;

Hasala Senevirathne
fonte