Ok after adding references to System.Management and System.Management.Instrumentation, I made some changes to the code, in order to fix several errors (concatenation operator cannot be used on Object etc.)
Please note that the ManagementEventWatcher must be disposed of when the form is closed, otherwise an exception is thrown.Code:Imports System.Management Public Class Form3 Private WithEvents m_MediaConnectWatcher As ManagementEventWatcher Public USBDriveName As String Public USBDriveLetter As String Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load StartDetection() End Sub Private Sub Form3_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed m_MediaConnectWatcher.Stop() m_MediaConnectWatcher.Dispose() End Sub Public Sub StartDetection() Dim query2 As New WqlEventQuery("SELECT * FROM __InstanceOperationEvent WITHIN 1 " & "WHERE TargetInstance ISA 'Win32_DiskDrive'") m_MediaConnectWatcher = New ManagementEventWatcher m_MediaConnectWatcher.Query = query2 m_MediaConnectWatcher.Start() End Sub Private Sub Arrived(ByVal sender As Object, ByVal e As System.Management.EventArrivedEventArgs) Handles m_MediaConnectWatcher.EventArrived Dim mbo As ManagementBaseObject Dim obj As ManagementBaseObject mbo = CType(e.NewEvent, ManagementBaseObject) obj = CType(mbo("TargetInstance"), ManagementBaseObject) Select Case mbo.ClassPath.ClassName Case "__InstanceCreationEvent" If obj.Item("InterfaceType").ToString = "USB" Then USBDriveName = obj.Item("Caption").ToString USBDriveLetter = GetDriveLetterFromDisk(obj.Item("Name").ToString) MessageBox.Show(USBDriveName & " (Drive letter " & USBDriveLetter & ") has been plugged in") End If Case "__InstanceDeletionEvent" If obj.Item("InterfaceType").ToString = "USB" Then MessageBox.Show(USBDriveName & " was disconnected. " & USBDriveLetter & " is now inaccessible.") 'GetDriveLetterFromDisk(obj.Item("Name").ToString)) If obj.Item("Caption").ToString = USBDriveName Then USBDriveLetter = "" USBDriveName = "" End If End If Case Else MessageBox.Show("nope: " & obj.Item("Caption").ToString) End Select End Sub Private Function GetDriveLetterFromDisk(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.Item("DeviceID").ToString & """} WHERE AssocClass = Win32_LogicalDiskToPartition") mos_disk = New ManagementObjectSearcher(oq_disk) For Each obj_disk In mos_disk.Get() ans &= obj_disk.Item("Name").ToString & "," Next Next Return ans.Trim(","c) End Function





Reply With Quote