Option Explicit Public Const GWL_WNDPROC = (-4) Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Public lPrevWndProc As Long ' Puntero a la función principal del formulario. Function DevWindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ' ' Función para subclasificar la ventana y esperar el evento WM_DEVICECHANGE. ' Dim lpDevHdr As DEV_BROADCAST_HDR Dim lpDevVolume As DEV_BROADCAST_VOLUME If (uMsg = WM_DEVICECHANGE) Then If (wParam = DBT_DEVICEARRIVAL) Then ' ' Se insertó un nuevo dispositivo USB. ' ' Lee la estructura de la memoria. ' Call CopyMemory(lpDevHdr, ByVal lParam, Len(lpDevHdr)) If (lpDevHdr.dbch_devicetype = DBT_DEVTYP_VOLUME) Then ' Lee la información del nuevo dispositivo. ' Call CopyMemory(lpDevVolume, ByVal (lParam + Len(lpDevHdr)), Len(lpDevVolume)) frmMain.lblInfo = "Se encontró un nuevo volumen: " & GetDriveFromMask(lpDevVolume.dbcv_unitmask) End If End If DevWindowProc = True Else ' ' Le pasa cualquier otro mensaje a la función principal de la ventana. ' DevWindowProc = CallWindowProc(lPrevWndProc, frmMain.hWnd, uMsg, wParam, lParam) End If End Function Function GetDriveFromMask(ByVal unitmask As Long) As String Dim i%, iDriveType% unitmask = LoWord(unitmask) For i = 3 To 25 If ((unitmask And (2 ^ i)) Or (Abs(unitmask) And (2 ^ i))) Then iDriveType = GetDriveType(Chr$(65 + i) & ":") If (iDriveType = 2) Then Exit For End If End If Next GetDriveFromMask = Chr$(i + 65) End Function Function LoWord(Dword As Long) As Integer If Dword And &H8000& Then LoWord = &H8000 Or (Dword And &H7FFF&) Else LoWord = Dword And &HFFFF& End If End Function