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 a 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 do 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 usando 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:

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

Os namespaces usados no exemplo deste artigo são definidas 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 esta 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 seja 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:


José Carlos Macoratti