Colocando um ícone na bandeja do sistema para sua aplicação .NET

Se você está escrevendo um programa que irá rodar a maior parte do tempo em background, com pouca ou mesmo nenhuma intervenção do usuário, utilizar um ícone na bandeja do sistema (system tray, aquele lugar ao lado do relógio… também é conhecido como barra de notificação) pode ser uma mão na roda. Além de economizar o espaço de uma janela na sua barra de tarefas, você pode colocar um menu com algumas atividades mais comuns, fazendo com que o usuário não precise nem restaurar a aplicação para executar algumas tarefas.

Neste post, vou demonstrar como colocar um ícone na barra de notificação. No próximo post, mostrarei como configurar e exibir um balão de dica para o ícone e depois em outro post, como adicionar um menu de acesso rápido para o ícone.

Além disso, irei disponibilizar um projeto de exemplo com código para as funcionalidades que estou falando nestes dois posts.

Colocando um ícone na bandeja para sua aplicação

Controle NotifyIcon no Visual Studio 2008

Em uma aplicação Windows Forms, o .NET Framework nos oferece o controle NotifyIcon, que será o responsável por representar o ícone da aplicação na bandeja do sistema. Para utilizá-lo, basta clicar no controle NotifyIcon na aba Commom Controls da Toolbox (veja figura acima), e arrastá-lo para o form principal de sua aplicação. Pode soltá-lo em qualquer lugar do form, pois o Visual Studio irá colocá-lo fora do form, como ilustrado na figura abaixo:

Controle NotifyIcon inserido no form

Com o controle adicionado, é necessário definir o ícone, através da janela de propriedades do Visual Studio. Observe que mesmo que o form já tenha um ícone configurado, você deve atribuir um ícone para este componente.

Depois de escolher um ícone, se o programa for executado, o ícone será colocado na bandeja, mas ainda sem nenhuma funcionalidade, como ilustrado na figura abaixo. O programa continuará sempre ocupando espaço na barra de tarefas, mesmo que esteja minimizado, e qualquer clique no ícone será inútil, pois ainda não definimos nada para ser realizado ao disparo dos eventos do mouse.

Ícone na bandeja e aplicação rodando

Para a aplicação deixar de aparecer na barra de tarefas quando for minimizada, deve-se adicionar o seguinte código no evento Resize do seu formulário principal (Com o formulário selecionado, na janela de propriedades clique no raio para ver os eventos, e depois dê dois cliques em Resize):

C#:

if (this.WindowState == FormWindowState.Minimized)
{
    this.Hide();
}

VB.NET:

If (Me.WindowState = FormWindowState.Minimized) Then
    Me.Hide()
End If

Desta forma, quando a janela for minimizada, a aplicação deixará de existir na barra de tarefas. O ícone da bandeja terá então a responsabilidade de restaurar a janela do programa. Para inserir este comportamento, o seguinte código deve ser executado quando o evento Click ou DoubleClick (à sua escolha) do seu NotifyIcon for disparado:

C#:

this.Show();
this.WindowState = FormWindowState.Normal;

VB.NET:

Me.Show()
Me.WindowState = FormWindowState.Normal

Desta forma, quando o ícone for clicado, a janela volta a aparecer e é restaurada. Pronto, sua aplicação quando é minimizada fica apenas na bandeja.

Para um resultado um pouco mais “sofisticado”, você pode também alterar a propriedade Visible do NotifyIcon para false quando a janela estiver visível, retornando o valor para true quando o usuário minimizar novamente a aplicação. Desta forma, obtêm-se o efeito de “minimize to tray”, comum em alguns programas como o Winamp, por exemplo.

Clique aqui para ver o próximo post, onde explico como exibir o balão de notificação.

Para um tutorial de como atribuir um menu ao ícone de sua aplicação, siga este link.

Anúncios

11 Responses to Colocando um ícone na bandeja do sistema para sua aplicação .NET

  1. […] balões em ícones da bandeja No post anterior, expliquei como colocar um ícone na bandeja para sua aplicação .NET. Mostrei apenas o básico, […]

  2. […] um menu ao ícone na bandeja Depois de mostrar como colocar um ícone na bandeja para a sua aplicação e a mostrar o balão de notificação a partir deste ícone, irei neste post descrever o […]

  3. Eduardo disse:

    Muito obrigado. Isso é relativamente simples, porém de grandíssima utilidade. Você foi totalmente didatido.

    Gostaria, se me permite, acrescentar umas alterações que precisei fazer em virtude de alguns erros apresentados para mim. Como estou utilizando o Microsoft Visual Studio 2008, Realizei as seguintes alterações para funcionamento:

    ‘——- PARA MINIMIZAR ALTEREI ISTO ———-
    ‘if (this.WindowState == FormWindowState.Minimized)
    ‘{
    ‘this.Hide();
    ‘}

    ‘——- PARA ISTO ———–
    If (Me.WindowState = FormWindowState.Minimized) Then
    Me.Hide()
    End If

    ‘——- PARA MAXIMIZAR ALTEREI ISTO ———

    ‘this.Show();
    ‘this.WindowState = FormWindowState.Normal;

    ‘——- PARA ISTO ——————
    Me.Show()
    Me.WindowState = FormWindowState.Normal

    Então funcionou perfeitamente. Valeu muito.

    • Opa Eduardo,

      Obrigado pela visita. Fico feliz por saber que o post foi útil pra você!

      O seu “problema” com o código não foi o fato do seu VS ser o 2008. O problema é que meu código está em C#, e seu projeto usa VB.NET ;)… falha minha não ter comentado isso durante o post.

      Vou colocar seu código no post como exemplo de como fazer em VB.NET ok?

      Obrigado pela contribuição!

  4. Luis Lacombe disse:

    Muito bom esse post. Parabéns.

  5. Edenilson disse:

    Não consegui… Uso vb 2010 na linguagem vb.net
    como ficou o codigo:

    Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize

    If (Me.WindowState = FormWindowState.Minimized) Then
    Me.Hide()
    End If

    End Sub

    Private Sub NotifyIcon1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick
    Me.Show()
    Me.WindowState = FormWindowState.Normal

    End Sub

    Tentei em VB depois em C# e nem um dos dois funcionol, Ele minimiza e dasaparece, Não vai pra notify area

  6. Edenilson disse:

    Agr funcionou valeu..
    Eu quri saber agr como faz pra quando a pessoa fechar ele ir para la tbm..

  7. I like what you guys are up too. This sort of clever
    work and coverage! Keep up the awesome works guys I’ve incorporated you guys to
    our blogroll.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: