VB .NET -  Monitorando as portas USB


 No artigo de hoje vou mostrar como podemos obter informações das portas USB monitorando os eventos e indicando quando um dispositivo é conectado e/ou desconectado. 

Você já precisou determinar quando um dispositivo USB foi inserido/removido do seu computador em um programa VB .NET ?

Existem várias maneiras de verificar isso. Você pode usar diversas APIs como RegisterDeviceNotification e UnRegisterDeviceNotification ou pode usar os recursos da WMI (Windows Management Intrumentation).

No artigo de hoje eu vou usar a abordagem WMI.

O WMI (Windows Management Instrumentation), é a infraestrutura para o gerenciamento de dados e operações em sistemas operacionais baseados no Windows. Ou seja,usando os recurso do WMI, podemos recuperar dados que está no coração do nosso hardware e/ou serviços.

Vamos usar o namespace System.Management que fornece acesso a um rico conjunto de informação e gestão de eventos sobre o sistema, dispositivos e aplicativos instrumentados para a infraestrutura do WMI. Ele fornece as classes necessárias para instrumentar aplicativos para gerenciamento e expondo suas informações de gestão e eventos através do WMI aos potenciais consumidores.

Os aplicativos e serviços podem consultar informação de gestão, usando as classes derivadas de ManagementObjectSearcher e ManagementQuery ou uma variedade de eventos de gerenciamento usando a classe ManagementEventWatcher. Os dados acessíveis podem ser de componentes gerenciados e não gerenciados no ambiente distribuído.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando a solução no VS 2015

Abra o VS 2015 Community  e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application e informe o nome : VBNET_Porta_USB;

A seguir no formulário padrão form1.vb inclua os seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme a figura abaixo:

Defina o seguinte namespace no início do formulário :

Imports System.Management

A seguir, após a declaração do formulário declare a variável que irá monitorar os eventos relacionados com a inserção e remoção de dispositivos USB:

Private WithEvents MonitoraDispositivo As ManagementEventWatcher

A classe ManagementEventWatcher se inscreve para notificações de evento temporário com base em um consulta de eventos.

1- Ativando a monitoração dos eventos:

Private Sub btnMonitorar_Click(sender As Object, e As EventArgs) Handles btnMonitorar.Click
        Try
            Dim consulta As String = "SELECT * FROM __InstanceOperationEvent WITHIN 10 WHERE TargetInstance ISA ""Win32_DiskDrive"""
            MonitoraDispositivo = New ManagementEventWatcher(consulta)
            MonitoraDispositivo.Start()
            lblmsg.BackColor = Color.Green
            lblmsg.Text = "ATIVO"
            MonitoraDispositivo.WaitForNextEvent()
        Catch ex As Exception
            MessageBox.Show(ex.Message + vbCrLf + ex.InnerException.ToString())
        End Try
    End Sub

O código acima simplesmente verifica se existe um dispositivo inserido e inicia o objeto ManagementEventWatcher.

Abaixo temos a rotina Inserido que é usada quando um novo evento é iniciado.

 Private Sub Inserido(ByVal sender As Object, ByVal e As System.Management.EventArrivedEventArgs) Handles MonitoraDispositivo.EventArrived
        Dim mbo, obj As ManagementBaseObject
        mbo = CType(e.NewEvent, ManagementBaseObject)
        obj = CType(mbo("TargetInstance"), ManagementBaseObject)
        Select Case mbo.ClassPath.ClassName
            Case "__InstanceCreationEvent"
                If obj("InterfaceType") = "USB" Then
                    MsgBox(obj("Caption") & " (Drive letter " & GetLetraDriverDoDisco(obj("Name")) & ") foi CONECTADO !")
                End If
            Case "__InstanceDeletionEvent"
                If obj("InterfaceType") = "USB" Then
                    MsgBox(obj("Caption") & " foi DESCONECTADO !")
                End If
        End Select
End Sub

Este código produz uma mensagem informando que o dispositivo foi conectado e/ou desconectado. Chamamos o método GetLetraDriverDoDisco() para fornecer a letra do drive usado.

Abaixo temos o código do método GetLetraDriverDoDisco:

Private Function GetLetraDriverDoDisco(ByVal Name As String) As String
        Dim oq_part, oq_disk As ObjectQuery
        Dim mos_part, mos_disk As ManagementObjectSearcher
        Dim obj_part, obj_disk As ManagementObject
        Dim ans As String = ""
        Name = Replace(Name, "\", "\\")
        oq_part = New ObjectQuery("ASSOCIATORS OF _
             {Win32_DiskDrive.DeviceID=""" & Name & """} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
        mos_part = New ManagementObjectSearcher(oq_part)
        For Each obj_part In mos_part.Get()
            oq_disk = New ObjectQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & obj_part("DeviceID") & """} _
                WHERE AssocClass = Win32_LogicalDiskToPartition")
            mos_disk = New ManagementObjectSearcher(oq_disk)
            For Each obj_disk In mos_disk.Get()
                ans &= obj_disk("Name") & ","
            Next
        Next
        Return ans.Trim(","c)
  End Function

Executando o projeto, após ativar a monitoração, ao desconectar um pendrive da porta USB teremos o seguinte resultado:

Nota: Podemos usar também o componente BackgroundWorker para fazer a monitoração.

Pegue o projeto completo aqui : VBNET_Porta_USB.zip

Deus nunca foi visto por alguém. O Filho unigênito (Jesus), que está no seio do Pai, esse o revelou.
João 1:18

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti