Recopilar información de las unidades conectadas en ese momento:
Código
#Region " Get Drives Info Function " ' [ Get Drives Info Function ] ' ' // By Elektro H@cker ' ' Examples : ' ' Dim CDROMS = Get_Drives_Info(DriveType.CDRom, True) ' For Each Drive_Info In Get_Drives_Info(DriveType.ALL, True, True, True, True, True, True) : MsgBox(Drive_Info) : Next Private Enum DriveType ALL CDRom = IO.DriveType.CDRom Fixed = IO.DriveType.Fixed Network = IO.DriveType.Network Ram = IO.DriveType.Ram Removable = IO.DriveType.Removable Unknown = IO.DriveType.Unknown End Enum Private Function Get_Drives_Info( _ ByVal DriveType As DriveType, _ ByVal Name As Boolean, _ Optional ByVal Label As Boolean = False, _ Optional ByVal Type As Boolean = False, _ Optional ByVal Format As Boolean = False, _ Optional ByVal Size As Boolean = False, _ Optional ByVal FreeSpace As Boolean = False) As List(Of String) Dim Drive_Info_List As New List(Of String) Dim Drive_Info As String = Nothing End If End If If Drive_Info IsNot Nothing Then Drive_Info_List.Add(Drive_Info) : Drive_Info = Nothing Next Return Drive_Info_List End Function #End Region
Monitorizar la inserción/extracción de dispositivos (y obtener información adicional)
by Keyen Night
Código
#Region " Monitorize Drives " ' Diccionario para guardar información (letra, información) Public Event DriveConnected(ByVal e As IO.DriveInfo) Public Event DriveDisconnected(ByVal e As DriveInfoGhost) ' Estructura que replica el contenido de DriveInfo Public Structure DriveInfoGhost Public Name As String Public AvailableFreeSpace As Long Public DriveFormat As String Public DriveType As IO.DriveType Public RootDirectory As String Public TotalFreeSpace As Long Public TotalSize As Long Public VolumeLabel As String Public Sub New(ByVal e As IO.DriveInfo) Name = e.Name AvailableFreeSpace = e.AvailableFreeSpace DriveFormat = e.DriveFormat DriveType = e.DriveType RootDirectory = e.RootDirectory.FullName TotalFreeSpace = e.TotalFreeSpace TotalSize = e.TotalSize VolumeLabel = e.VolumeLabel End Sub End Structure ' Estructura nativa de Windows para almacenar información de dispositivos Public Structure WindowsDrive Public Size As Integer Public Type As Integer Public Reserved As Integer Public Mask As Integer End Structure ' Constantes que necesitamos Public Enum ConstWindowsDrivers As Integer Change = &H219 Arrival = &H8000 QueryRemove = &H8001 QueryRemoveFailed = &H8002 RemovePending = &H8003 RemoveComplete = &H8004 TypeVolume = &H2 End Enum Protected Overrides Sub WndProc(ByRef [Message] As Message) Select Case [Message].Msg ' Filtramos los mensajes Case ConstWindowsDrivers.Change ' Si el Hardware cambió ' Transformamos el puntero del primer parametro en una estructura de datos Dim CurrentWDrive As WindowsDrive = CType(System.Runtime.InteropServices.Marshal.PtrToStructure([Message].LParam, GetType(WindowsDrive)), WindowsDrive) ' Transformamos la estructura en información de la unidad Dim CurrentDrive As IO.DriveInfo = New IO.DriveInfo(GetDriveLetter(CurrentWDrive.Mask)) ' El segundo parametros nos indica si se esta desconectando o conectando Select Case [Message].WParam.ToInt32 ' Se esta conectando... Case ConstWindowsDrivers.Arrival ' Si es un dispositivo de almacenamiento If System.Runtime.InteropServices.Marshal.ReadInt32([Message].LParam, 4) = ConstWindowsDrivers.TypeVolume Then ' Llamamos un evento que controla la conexión RaiseEvent DriveConnected(CurrentDrive) ' Guardamos la información del dispositivo en un diccionario fantasma (letra, información), ' ya que cuando se desconecte habremos perdido toda la información, ' sólamente nos quedara la letra de la unidad, con ella podremos volver a obtener la información a traves del diccionario' CurrentDrives.Add(GetDriveLetter(CurrentWDrive.Mask), New DriveInfoGhost(CurrentDrive)) End If ' Si es desconectado... Case ConstWindowsDrivers.RemoveComplete ' Llamamos al evento de desconexión con la información en el diccionario fantasma, ' ya que no tenemos acceso a la información, porque el hardware ha sido desconectado RaiseEvent DriveDisconnected(CurrentDrives(GetDriveLetter(CurrentWDrive.Mask))) ' Removemos el hardware del diccionario CurrentDrives.Remove(GetDriveLetter(CurrentWDrive.Mask)) End Select End Select MyBase.WndProc([Message]) End Sub ' Nos traduce el código de los parametros a letras Private Function GetDriveLetter(ByVal Mask As Integer) As Char Dim Names() As Char = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"} Dim Devices As New BitArray(System.BitConverter.GetBytes(Mask)) For x As Integer = 0 To Devices.Length If Devices(x) Then Return Names(x) End If Next End Function ' Eventos Private Sub Main_DriveConnected(ByVal e As System.IO.DriveInfo) Handles Me.DriveConnected MessageBox.Show(String.Format("Se ha conectado la unidad {0}", e.Name)) End Sub Private Sub Main_DriveDisconnected(ByVal e As DriveInfoGhost) Handles Me.DriveDisconnected MessageBox.Show(String.Format("Se ha desconectado la unidad {0}", e.Name)) End Sub #End Region
Monitorizar la inserción/extracción de dispositivos (y obtener información adicional)
by Kub0x
PD: Añadir un listbox al Form para ver/entender como actua el code.
Código
Imports System.IO Imports System.Threading Public Class Inicio Private Delegate Sub ListenToUSB() Private Delegate Sub UpdateListBoxText(ByVal Text As String) Private Sub ListenToRemovableDrives() 'Mejor crear 1 sola variable que ochocientas mil e ir actualizándola periodicamente Dim connectedDrives As DriveInfo() = Nothing While True connectedDrives = DriveInfo.GetDrives() Next 'Aquí indica el tiempo que quieres que espere el proceso de escucha para después volver a comenzar Thread.Sleep(2500) End While End Sub End If End Sub Dim isInList As Boolean = False Dim i As Int32 = 0 Do isInList = True End If End If i += 1 Return i - 1 End Function Dim isInList As Boolean = False Dim i As Int32 = 0 Do isInList = True End If End If i += 1 Return isInList End Function 'Como la unidad USB no está siendo monitorizada por otro subproceso 'Añadimos sus características al ListBox ListBox1.BeginInvoke(New UpdateListBoxText(AddressOf UpdateLstBoxText), _ 'Monitorizamos la unidad USB Dim delegado As New MonitorizeUSB(AddressOf MonitorizeDrive) End If End Sub Dim Removed As Boolean = False While Not Removed Removed = True ReOrganizeArray(pos) ListBox1.BeginInvoke(New UpdateListBoxText(AddressOf UpdateLstBoxText), _ End If End While End Sub Private Sub ReOrganizeArray(ByVal pos As Int32) 'Eliminamos el elemento rotando el Array hacia la izquierda End Sub Private Sub UpdateLstBoxText(ByVal Text As String) ListBox1.Items.Add(Text) End Sub Private Sub Inicio_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Dim delegado As New ListenToUSB(AddressOf ListenToRemovableDrives) delegado.BeginInvoke(Nothing, Nothing) End Sub End Class



