![]() |
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.ManagementA 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 ManagementEventWatcherA 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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
https://msdn.microsoft.com/en-us/library/system.management%28v=vs.110%29.aspx