.NET

7 out, 2009

VB .NET – Monitorando as notificações de eventos do sistema

Publicidade


A classe
SystemEvents
fornece acesso às notificações de eventos do sistema e também fornece a capacidade

para responder a tipos específicos de eventos do sistema.

Quando um
evento do sistema é gerado, os delegados anexados ao evento são chamados usando
a linha de execução que monitora os eventos do sistema.

Portanto, você deve fazer qualquer chamada de seu manipulador de evento.

Se você precisar chamar um evento do sistema que não é exposto como um membro da
classe, você pode usar o método

InvokeOnEventsThread.

A seguir
temos alguns dos métodos da classe SystemEvents:

Nome Descrição

CreateTimer

Cria uma
nova janela Timer associado à janela eventos do sistema.


Equals

Determina
se o objeto especificado é igual ao objeto atual.


Finalize

Permite que
um objeto tente liberar recursos e executar outras operações de
limpeza antes de o objeto ser recuperado por coleta de lixo.


GetHashCode

Serve como
uma função hash para um tipo específico.


GetType

Obtém o tipo da instância
atual.


InvokeOnEventsThread

Chama o
representante especificado o segmento que escuta eventos do sistema.


KillTimer

Encerra o
timer especificado por determinada identificação.


MemberwiseClone

Cria uma
cópia superficial do objeto atual.

Podemos, então, usar esta classe para verificar
alterações no sistema operacional e neste artigo vou mostrar alguns exemplos.

Como a quantidade de eventos e condições que podem
ser monitorados são enormes, vou mostrar apenas alguns para que você tenha noção
de como podemos usar este recurso.

Lembrando que SystemEvents são eventos
disparados pelo sistema em resposta a ações que afetam o ambiente operacional.
Não confunda SystemEvents com eventos Win32, que são eventos do
Kernell, acessíveis por todos os programas. Abaixo
temos alguns eventos disparados pela classe SystemEvents:

  • DisplaySettingsChanged 
    –  Ocorre quando o usuário altera a exibição das configurações;
  • EventsThreadShutdown 
    –  Ocorre antes da thread que escuta os
    eventos do sistema terminar;
  • InstalledFontsChanged 
    –  Ocorre quando o usuário inclui ou remove fontes ao sistema;
  • LowMemory
    – Ocorre quando o sistema está rodando abaixo da memória RAM;
  • PaletteChanged
    – Ocorre quando o usuário muda para uma aplicação que usa uma paleta
    diferença;
  • PowerModeChanged 
    – Ocorre quando o usuário suspende ou reinicia o sistema;
  • SessionEnded
    – Ocorre quando o usuário está efetuando um logoff
    ou um shutdown no sistema;
  • SessionEnding
    – Ocorre quando o usuário tenta efetuar um logoff
    ou um shutdown no sistema;
  • TimeChanged
    – Ocorre quando o usuário muda a hora do sistema;
  • TimerElapsed –
    Ocorre quando o timer do Windows expirou;
  • UserPreferenceChanged –
    Ocorre quando uma preferência do usuário sofreu uma mudança;
  • UserPreferenceChanging
    – Ocorre quando uma preferência do usuário está sendo modificada;

Criando um exemplo para
efetuar a monitoração de eventos

Os namespaces
usados no exemplo deste artigo são definidos pelas seguintes declarações:

Imports
System
Imports Microsoft.Win32

Crie um novo projeto Windows Forms no
Visual Basic 2008  Express Edition e no
formulário padrão coloque o código abaixo:

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Define classe SystemEvents para receber as notificações dos eventos
'quando uma preferência do usuário for alterada, a paleta sofre alteração, a exibição das configurações mudar
'ou quando ocorrer uma alteração na data/hora
AddHandler SystemEvents.UserPreferenceChanging, AddressOf SystemEvents_UserPreferenceChanging
AddHandler SystemEvents.PaletteChanged, AddressOf SystemEvents_PaletteChanged
AddHandler SystemEvents.DisplaySettingsChanged, AddressOf SystemEvents_DisplaySettingsChanged
AddHandler Microsoft.Win32.SystemEvents.TimeChanged, AddressOf TimeChangedEvent

End Sub

'Verifica alterações na data/hora do sistema
Sub TimeChangedEvent(ByVal sender As Object, ByVal e As System.EventArgs)
MessageBox.Show("A data/hora do sistema foi alterada")
End Sub

' Este método é chamado quando uma preferência do usuário é alterada.
Private Sub SystemEvents_UserPreferenceChanging(ByVal sender As Object, ByVal e As UserPreferenceChangingEventArgs)
MessageBox.Show("Alteração de preferencias do usuário : " & e.Category.ToString())
End Sub

' Este método é chamado quando a paleta é alterada.
Private Sub SystemEvents_PaletteChanged(ByVal sender As Object, ByVal e As EventArgs)
MessageBox.Show("Ocorreu uma alteração na Paleta")
End Sub

' Este método é chamado quando as exibição das configurações muda
Private Sub SystemEvents_DisplaySettingsChanged(ByVal sender As Object, ByVal e As EventArgs)
MessageBox.Show("Exibição das configurações foi alterada.")
End Sub

' Verifica as alterações das preferências do usuário
Sub UserPreferenceChangedEvent(ByVal sender As Object, ByVal e As Microsoft.Win32.UserPreferenceChangedEventArgs)
' Verifica a categoria alterada
Select Case e.Category
Case Microsoft.Win32.UserPreferenceCategory.Color
MessageBox.Show("Foram alteradas as cores do sistema")
Case Microsoft.Win32.UserPreferenceCategory.Screensaver
MessageBox.Show("Foi alterado o screensaver do sistema")
Case Microsoft.Win32.UserPreferenceCategory.Window
MessageBox.Show("Foram alteradas dimensões ou características do sistema")
End Select
End Sub

Para testar o código acima, execute o projeto e
efetue uma alteração relacionada ao evento que estamos monitorando, como, por
exemplo, alterar a data do sistema. Você receberá um aviso emitido pela aplicação,
indicando que o evento está sendo monitorado.

Podemos usar os recursos da infra-estrutura da
plataforma .NET, como a classe SystemEvents para
criar algo útil, como monitorar os eventos para realizar algumas tarefas, como
gerar um log de auditoria ou não permitir que certas ações sejam executadas, como
não permitir o log off enquanto os dados não forem salvos, etc.

Eu sei, é apenas VB .NET, mas eu gosto…

Referências: