Dev (Back & Front)ARTIGO

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


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<br />        'Define classe SystemEvents para receber as notificações dos eventos <br />        'quando uma preferência do usuário for alterada, a paleta sofre alteração, a exibição das configurações mudar <br />        'ou quando ocorrer uma alteração na data/hora<br />        AddHandler SystemEvents.UserPreferenceChanging, AddressOf SystemEvents_UserPreferenceChanging<br />        AddHandler SystemEvents.PaletteChanged, AddressOf SystemEvents_PaletteChanged<br />        AddHandler SystemEvents.DisplaySettingsChanged, AddressOf SystemEvents_DisplaySettingsChanged<br />        AddHandler Microsoft.Win32.SystemEvents.TimeChanged, AddressOf TimeChangedEvent<br /><br />    End Sub<br /><br />    'Verifica alterações na data/hora do sistema<br />    Sub TimeChangedEvent(ByVal sender As Object, ByVal e As System.EventArgs)<br />        MessageBox.Show("A data/hora do sistema foi alterada")<br />    End Sub<br /><br />    ' Este método é chamado quando uma preferência do usuário é alterada.<br />    Private Sub SystemEvents_UserPreferenceChanging(ByVal sender As Object, ByVal e As UserPreferenceChangingEventArgs)<br />        MessageBox.Show("Alteração de preferencias do usuário : " & e.Category.ToString())<br />    End Sub<br /><br />    ' Este método é chamado quando a paleta é alterada.<br />    Private Sub SystemEvents_PaletteChanged(ByVal sender As Object, ByVal e As EventArgs)<br />        MessageBox.Show("Ocorreu uma alteração na Paleta")<br />    End Sub<br /><br />    ' Este método é chamado quando as exibição das configurações muda<br />    Private Sub SystemEvents_DisplaySettingsChanged(ByVal sender As Object, ByVal e As EventArgs)<br />        MessageBox.Show("Exibição das configurações foi alterada.")<br />    End Sub<br /><br />    ' Verifica as alterações das preferências do usuário<br />    Sub UserPreferenceChangedEvent(ByVal sender As Object, ByVal e As Microsoft.Win32.UserPreferenceChangedEventArgs)<br />        ' Verifica a categoria alterada<br />        Select Case e.Category<br />            Case Microsoft.Win32.UserPreferenceCategory.Color<br />                MessageBox.Show("Foram alteradas as cores do sistema")<br />            Case Microsoft.Win32.UserPreferenceCategory.Screensaver<br />                MessageBox.Show("Foi alterado o screensaver do sistema")<br />            Case Microsoft.Win32.UserPreferenceCategory.Window<br />                MessageBox.Show("Foram alteradas dimensões ou características do sistema")<br />        End Select<br />    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:

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil