VB - Problemas com NotifyIcon : Erro ao Desligar o Windows

Por Bruno Dinov

Se você está tendo problemas ao desligar o Windows quando se utiliza de um NotifyIcon, este artigo irá lhe auxiliar a superá-lo. Eu tive este problema e quase me descabelei para encontrar a solução, e quando à encontrei, me dei conta que fui omisso em certo ponto. Eu Não fiquei tão triste comigo mesmo, pois percebi que muitas pessoas estavam com o mesmo problema que eu, e consequentemente não se atentaram para o mesmo detalhe.

O Problema ocorre quando temos um formulário que ao clicarmos em seu botão fechar , ao invés do form realmente ser encerrado, ele é minimizado na Bandeja de Sistema (SysTray). O Formulário só é realmente fechado quando o usuário acessa o menu do formulário e clica na opção "Sair".

Para Controlar este fluxo o form utiliza-se de uma variável do tipo "boolean" (No Exemplo essa variável tem o nome de "bFechar"). Confira a Programação para o evento "OnClosing" do Form.

Protected Overrides Sub OnClosing(ByVal e As System.ComponentModel.CancelEventArgs)

If Not bFechar Then
        e.Cancel =
True
       
Me.WindowState = FormWindowState.Minimized
       
Me.Visible = False
Else
        e.Cancel = False
End If

End Sub


A Variável "bFechar" somente é setada para "True" quando o opção "Sair" do menu do formulário é pressionada:

Private Sub mnuSairIcon_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuSairIcon.Click

        bFechar = True
       
Me.Close()

End Sub

Até aqui nosso sistema está funcionando como queríamos. Porém, você passa a notar que se o seu sistema estiver aberto, e você tentar desligar, reiniciar ou efetuar Logoff do Sistema, não irá conseguir. Parece que o Windows decidiu a ignorar o sua ordem. Se encerrar sua aplicação e tentar desligar você terá êxito.

O que ocorre na verdade é que ao executar a ação de desligar o sistema, seu form tenta ser encerrado, e automaticamente é disparado o evento "OnClosing". Como a Variável "bFechar" está setada para "False" a função "OnClosing" é cancelada "e.Cancel = True".

Para corrigirmos este problema o seu sistema deve identificar a ação do Windows. Para isso iremos utilizar o seguinte código:

' Declare a Constante abaixo
Private
Shared WM_QUERYENDSESSION As Integer = &H11

'Utilize-se da "Override" , "WndProc" para identificar a mensagem do Windows.

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
'Identificando que o windows está tentando reiniciar, desligar ou efetuar logoff

                If m.Msg = WM_QUERYENDSESSION Then

                               b Fechar = True

                End If

                MyBase.WndProc(m)

End Sub

É isso ae Galera, até uma próxima!!!

Obrigado!

Bruno!

Faça como o Bruno , Compartilhe sua dica ou artigo,  envie sua colaboração. 

Veja como particpar em : http://www.macoratti.net/colabora.htm


José Carlos Macoratti