Mostrando um ContextMenuStrip ao clicar com o botão esquerto em um NotifyIcon + Extension Method

Publicado: 14/11/2007 em Windows Forms

Pessoal uma dica rápida aqui sobre o desenvolvimento em C# para Windows Forms.
Quando queremos que nossa aplicação tenho um ícone no Tray utilizamos o compoenente NotifyIcon que já vem com a biblioteca padrão do .Net.

Este component nos permite mostrar os Baloons do Windows e ainda ter um menu de acesso rápido para controlar a aplicação.
Pois bem, ao associarmos um menustrip ao NotifyIcon, automaticamente ao clicarmos com o botão direito no ícone no Tray o menu é exibido, porém com o botão esquerdo não…
Poderíamos tentar um NotifyIcon.Show(), mas este método apresenta um comportamento estranho, mostrando a janela do menu na TaskBar e o posicionamento não é muito correto.

nofity1

Mas a rotina de exibir o menu corretamente existe, concordam? Existe, mas ela não é pública, é o método ShowContextMenu do NotifyIcon. Bom o que fazer? Usar o nosso querido e poderoso Reflection que quebra qualquer modificador de acesso e executa métodos privados dos assemblies sem maiores problemas.

Então a nossa solução: Encontrar o método ShowContextMenu no e invocá-lo no evento MouseUp do NotifyIcon

private void Notify_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                System.Reflection.MethodInfo methodInfo = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
                methodInfo.Invoke(Notify, null);
            }

        }

Simples não? Localizamos os método e o executamos a partir da instância do nosso NotifyIcon(Notify).

notify2

Temos um ícone funcionando muito bem agora.
ps: as duas primeiras imagens eu peguei no codeproject, porém a solução do codeproject não era ideal!

———————————————————————————————————————————————-Update

Após blogar, o amigo Fabio Galuppo deu uma grande sugestão para resolvermos este problema de uma maneira mais interessante com o .Net 3.5 utilizando Extension Methods!
A solução é bastante simples mas o resultado eh muito interessante.

Primeiro criamos um Extension Method para a classe NotifyIcon.

        /// <summary>
        /// Exibe o menu corretamente
        /// </summary>
        /// <param name="notify"></param>
        public static void ShowContextMenu(this NotifyIcon notify)
        {
            System.Reflection.MethodInfo methodInfo = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
            methodInfo.Invoke(notify, null);
        }

Isto fará com que toda vez que acessemos um objeto NotifyIcon ele tenha o nosso antigo método privado ShowContextMenu explícito e ainda com o comentário XML adicionado ao método!

notify3

Divirtam-se!!

comentários
  1. Juliano disse:

    E aí garoto 360…Cara, tu me salvou um bom tempo de pesquisa. Vou precisar implementar isto no projeto em que estou, agora já tenho o que preciso.Ótima dica.E quanto aos Extension Methods…é um dos recursos mais loucos do .Net 3.5. Já adicionei em classes para permitir novas conversões (ex: string.ToByteArray). Show de bola!

  2. Murilo disse:

    eheheheh ki bom! ja serviu pra alguma coisa esse post, eu também gosto muito do extension methods, uma grande sacada dos caras!!!

Deixe uma resposta

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