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 = TrueMe.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 = TrueEnd 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