'工程-引用-选中Microsoft Scripting Runtime-确定 Private Sub Timer1_Timer() Dim fs, vDrv Set fs = CreateObject("scripting.filesystemobject") For Each vDrv In fs.Drives If vDrv.DriveType = Removable Then MsgBox "有移动存储插入!" Timer1.Enabled = False Exit Sub End If Next End Sub
'In a module Option ExplicitPublic Type GUID Data1(1 To 4) As Byte Data2(1 To 2) As Byte Data3(1 To 2) As Byte Data4(1 To 8) As Byte End TypePublic Type DEV_BROADCAST_DEVICEINTERFACE dbcc_size As Long dbcc_devicetype As Long dbcc_reserved As Long dbcc_classguid As GUID dbcc_name As Long End TypePublic Type DEV_BROADCAST_DEVICEINTERFACE2 dbcc_size As Long dbcc_devicetype As Long dbcc_reserved As Long dbcc_classguid As GUID dbcc_name As String * 1024 End TypePublic Declare Function RegisterDeviceNotification Lib "user32.dll" _ Alias "RegisterDeviceNotificationA" ( _ ByVal hRecipient As Long, _ NotificationFilter As Any, _ ByVal Flags As Long) As Long
Public Declare Function UnregisterDeviceNotification Lib "user32.dll" _ (ByVal hRecipient As Long) As Long
Public Const DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = &H4 Public Const DEVICE_NOTIFY_WINDOW_HANDLE = 0
Public Declare Sub CopyMemory Lib "kernel32" Alias _ "RtlMoveMemory" (Destination As Any, Source As Any, _ ByVal Length As Long)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 LongPublic Declare Function GetWindowLong Lib "user32" _ Alias "GetWindowLongA" (ByVal hWnd As Long, _ ByVal nIndex As Long) As LongPublic Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" (ByVal hWnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = (-4) Public Const WM_DEVICECHANGE = &H219 Public Const UNSAFE_REMOVE = &H1CPublic glngPrevWndProc As LongPublic Type DEV_BROADCAST_HDR dbch_size As Long dbch_devicetype As Long dbch_reserved As Long End TypePublic Const DBT_CONFIGCHANGECANCELED As Long = 25 Public Const DBT_CONFIGCHANGED As Long = 24 Public Const DBT_CUSTOMEVENT As Long = 32744 Public Const DBT_DEVICEARRIVAL As Long = 32768 Public Const DBT_DEVICEQUERYREMOVE As Long = 32769 Public Const DBT_DEVICEQUERYREMOVEFAILED As Long = 32770 Public Const DBT_DEVICEREMOVECOMPLETE As Long = 32772 Public Const DBT_DEVICEREMOVEPENDING As Long = 32771 Public Const DBT_DEVICETYPESPECIFIC As Long = 32773 Public Const DBT_DEVNODES_CHANGED As Long = 7 Public Const DBT_QUERYCHANGECONFIG As Long = 23 Public Const DBT_USERDEFINED As Long = 65535Public Const DBT_DEVTYP_OEM As Long = 0 Public Const DBT_DEVTYP_DEVNODE As Long = 1 Public Const DBT_DEVTYP_VOLUME As Long = 2 Public Const DBT_DEVTYP_PORT As Long = 3 Public Const DBT_DEVTYP_NET As Long = 4 Public Const DBT_DEVTYP_DEVICEINTERFACE As Long = 5 Public Const DBT_DEVTYP_HANDLE As Long = 6
Public Function MyWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim dbHdr As DEV_BROADCAST_HDR
Dim dbDdb As DEV_BROADCAST_DEVICEINTERFACE2
Select Case Msg Case WM_DEVICECHANGE
Form1.List1.AddItem "WM_DEVICECHANGE " & Msg
Select Case wParam
Case DBT_CONFIGCHANGECANCELED Form1.List1.AddItem "wParam = DBT_CONFIGCHANGECANCELED"
Case DBT_CONFIGCHANGED Form1.List1.AddItem "wParam = DBT_CONFIGCHANGED"
Case DBT_CUSTOMEVENT Form1.List1.AddItem "wParam = DBT_CUSTOMEVENT"
Case DBT_DEVICEARRIVAL Form1.List1.AddItem "wParam = DBT_DEVICEARRIVAL"
CopyMemory dbHdr, ByVal (lParam), Len(dbHdr)
Select Case dbHdr.dbch_devicetype Case DBT_DEVTYP_OEM Form1.List1.AddItem "Device Type: DBT_DEVTYP_OEM"
Case DBT_DEVTYP_DEVNODE Form1.List1.AddItem "Device Type: DBT_DEVTYP_DEVNODE"
Case DBT_DEVTYP_VOLUME Form1.List1.AddItem "Device Type: DBT_DEVTYP_VOLUME"
Case DBT_DEVTYP_PORT Form1.List1.AddItem "Device Type: DBT_DEVTYP_PORT"
Case DBT_DEVTYP_NET Form1.List1.AddItem "Device Type: DBT_DEVTYP_NET"
Case DBT_DEVTYP_DEVICEINTERFACE Form1.List1.AddItem "Device Type: DBT_DEVTYP_DEVICEINTERFACE"
Case DBT_DEVTYP_HANDLE Form1.List1.AddItem "Device Type: DBT_DEVTYP_HANDLE"
Case Else Form1.List1.AddItem "Device Type unknown: " & CStr(dbHdr.dbch_devicetype)
End Select
Case DBT_DEVICEQUERYREMOVE Form1.List1.AddItem "wParam = DBT_DEVICEQUERYREMOVE"
Case DBT_DEVICEQUERYREMOVEFAILED Form1.List1.AddItem "wParam = DBT_DEVICEQUERYREMOVEFAILED"
Case DBT_DEVICEREMOVECOMPLETE Form1.List1.AddItem "wParam = DBT_DEVICEREMOVECOMPLETE"
Case DBT_DEVICEREMOVEPENDING Form1.List1.AddItem "wParam = DBT_DEVICEREMOVEPENDING"
Case DBT_DEVICETYPESPECIFIC Form1.List1.AddItem "wParam = DBT_DEVICETYPESPECIFIC"
Case DBT_DEVNODES_CHANGED Form1.List1.AddItem "wParam = DBT_DEVNODES_CHANGED"
Case DBT_QUERYCHANGECONFIG Form1.List1.AddItem "wParam = DBT_QUERYCHANGECONFIG"
Case DBT_USERDEFINED Form1.List1.AddItem "wParam = DBT_USERDEFINED"
Case Else Form1.List1.AddItem "wParam = unknown = " & wParam
End Select
End Select
' pass the rest messages onto VB's own Window Procedure MyWindowProc = CallWindowProc(glngPrevWndProc, hWnd, Msg, wParam, lParam) End Function Public Function DoRegisterDeviceInterface(hWnd As Long, ByRef hDevNotify As Long) As Boolean Dim NotificationFilter As DEV_BROADCAST_DEVICEINTERFACE
hDevNotify = RegisterDeviceNotification(hWnd, NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE Or DEVICE_NOTIFY_ALL_INTERFACE_CLASSES)
If hDevNotify = 0 Then MsgBox "RegisterDeviceNotification failed: " & CStr(Err.LastDllError), vbOKOnly DoRegisterDeviceInterface = False Exit Function End If
DoRegisterDeviceInterface = True End Function
'Place a listbox (Listbox1) on a form (Form1) and add this code In a form Option ExplicitDim hDevNotify As LongPrivate Sub Form_Load() Call DoRegisterDeviceInterface(Me.hWnd, hDevNotify) glngPrevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC) SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf MyWindowProc End SubPrivate Sub Form_Unload(Cancel As Integer) If hDevNotify <> 0 Then Call UnregisterDeviceNotification(hDevNotify) End If 'pass control back to previous windows SetWindowLong Me.hWnd, GWL_WNDPROC, glngPrevWndProc End Sub
DBT_DEVICEARRIVAL
移除
DBT_DEVICEREMOVECOMPLETE
DBT_DEVICEARRIVAL
移除
DBT_DEVICEREMOVECOMPLETE
我给你的是消息常量只需要弄个subclass就可以了
Private Sub Timer1_Timer()
Dim fs, vDrv
Set fs = CreateObject("scripting.filesystemobject")
For Each vDrv In fs.Drives
If vDrv.DriveType = Removable Then
MsgBox "有移动存储插入!"
Timer1.Enabled = False
Exit Sub
End If
Next
End Sub
'In a module
Option ExplicitPublic Type GUID
Data1(1 To 4) As Byte
Data2(1 To 2) As Byte
Data3(1 To 2) As Byte
Data4(1 To 8) As Byte
End TypePublic Type DEV_BROADCAST_DEVICEINTERFACE
dbcc_size As Long
dbcc_devicetype As Long
dbcc_reserved As Long
dbcc_classguid As GUID
dbcc_name As Long
End TypePublic Type DEV_BROADCAST_DEVICEINTERFACE2
dbcc_size As Long
dbcc_devicetype As Long
dbcc_reserved As Long
dbcc_classguid As GUID
dbcc_name As String * 1024
End TypePublic Declare Function RegisterDeviceNotification Lib "user32.dll" _
Alias "RegisterDeviceNotificationA" ( _
ByVal hRecipient As Long, _
NotificationFilter As Any, _
ByVal Flags As Long) As Long
Public Declare Function UnregisterDeviceNotification Lib "user32.dll" _
(ByVal hRecipient As Long) As Long
Public Const DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = &H4
Public Const DEVICE_NOTIFY_WINDOW_HANDLE = 0
Public Declare Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (Destination As Any, Source As Any, _
ByVal Length As Long)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 LongPublic Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As LongPublic Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_DEVICECHANGE = &H219
Public Const UNSAFE_REMOVE = &H1CPublic glngPrevWndProc As LongPublic Type DEV_BROADCAST_HDR
dbch_size As Long
dbch_devicetype As Long
dbch_reserved As Long
End TypePublic Const DBT_CONFIGCHANGECANCELED As Long = 25
Public Const DBT_CONFIGCHANGED As Long = 24
Public Const DBT_CUSTOMEVENT As Long = 32744
Public Const DBT_DEVICEARRIVAL As Long = 32768
Public Const DBT_DEVICEQUERYREMOVE As Long = 32769
Public Const DBT_DEVICEQUERYREMOVEFAILED As Long = 32770
Public Const DBT_DEVICEREMOVECOMPLETE As Long = 32772
Public Const DBT_DEVICEREMOVEPENDING As Long = 32771
Public Const DBT_DEVICETYPESPECIFIC As Long = 32773
Public Const DBT_DEVNODES_CHANGED As Long = 7
Public Const DBT_QUERYCHANGECONFIG As Long = 23
Public Const DBT_USERDEFINED As Long = 65535Public Const DBT_DEVTYP_OEM As Long = 0
Public Const DBT_DEVTYP_DEVNODE As Long = 1
Public Const DBT_DEVTYP_VOLUME As Long = 2
Public Const DBT_DEVTYP_PORT As Long = 3
Public Const DBT_DEVTYP_NET As Long = 4
Public Const DBT_DEVTYP_DEVICEINTERFACE As Long = 5
Public Const DBT_DEVTYP_HANDLE As Long = 6
Public Function MyWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim dbHdr As DEV_BROADCAST_HDR
Dim dbDdb As DEV_BROADCAST_DEVICEINTERFACE2
Select Case Msg
Case WM_DEVICECHANGE
Form1.List1.AddItem "WM_DEVICECHANGE " & Msg
Select Case wParam
Case DBT_CONFIGCHANGECANCELED
Form1.List1.AddItem "wParam = DBT_CONFIGCHANGECANCELED"
Case DBT_CONFIGCHANGED
Form1.List1.AddItem "wParam = DBT_CONFIGCHANGED"
Case DBT_CUSTOMEVENT
Form1.List1.AddItem "wParam = DBT_CUSTOMEVENT"
Case DBT_DEVICEARRIVAL
Form1.List1.AddItem "wParam = DBT_DEVICEARRIVAL"
CopyMemory dbHdr, ByVal (lParam), Len(dbHdr)
Select Case dbHdr.dbch_devicetype
Case DBT_DEVTYP_OEM
Form1.List1.AddItem "Device Type: DBT_DEVTYP_OEM"
Case DBT_DEVTYP_DEVNODE
Form1.List1.AddItem "Device Type: DBT_DEVTYP_DEVNODE"
Case DBT_DEVTYP_VOLUME
Form1.List1.AddItem "Device Type: DBT_DEVTYP_VOLUME"
Case DBT_DEVTYP_PORT
Form1.List1.AddItem "Device Type: DBT_DEVTYP_PORT"
Case DBT_DEVTYP_NET
Form1.List1.AddItem "Device Type: DBT_DEVTYP_NET"
Case DBT_DEVTYP_DEVICEINTERFACE
Form1.List1.AddItem "Device Type: DBT_DEVTYP_DEVICEINTERFACE"
CopyMemory dbDdb, ByVal (lParam), ByVal (dbHdr.dbch_size)
Form1.List1.AddItem "Device Name: " & Mid(dbDdb.dbcc_name, 1, InStr(dbDdb.dbcc_name, Chr(0)))
Case DBT_DEVTYP_HANDLE
Form1.List1.AddItem "Device Type: DBT_DEVTYP_HANDLE"
Case Else
Form1.List1.AddItem "Device Type unknown: " & CStr(dbHdr.dbch_devicetype)
End Select
Case DBT_DEVICEQUERYREMOVE
Form1.List1.AddItem "wParam = DBT_DEVICEQUERYREMOVE"
Case DBT_DEVICEQUERYREMOVEFAILED
Form1.List1.AddItem "wParam = DBT_DEVICEQUERYREMOVEFAILED"
Case DBT_DEVICEREMOVECOMPLETE
Form1.List1.AddItem "wParam = DBT_DEVICEREMOVECOMPLETE"
Case DBT_DEVICEREMOVEPENDING
Form1.List1.AddItem "wParam = DBT_DEVICEREMOVEPENDING"
Case DBT_DEVICETYPESPECIFIC
Form1.List1.AddItem "wParam = DBT_DEVICETYPESPECIFIC"
Case DBT_DEVNODES_CHANGED
Form1.List1.AddItem "wParam = DBT_DEVNODES_CHANGED"
Case DBT_QUERYCHANGECONFIG
Form1.List1.AddItem "wParam = DBT_QUERYCHANGECONFIG"
Case DBT_USERDEFINED
Form1.List1.AddItem "wParam = DBT_USERDEFINED"
Case Else
Form1.List1.AddItem "wParam = unknown = " & wParam
End Select
End Select
' pass the rest messages onto VB's own Window Procedure
MyWindowProc = CallWindowProc(glngPrevWndProc, hWnd, Msg, wParam, lParam)
End Function
Public Function DoRegisterDeviceInterface(hWnd As Long, ByRef hDevNotify As Long) As Boolean Dim NotificationFilter As DEV_BROADCAST_DEVICEINTERFACE
NotificationFilter.dbcc_size = Len(NotificationFilter)
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE
hDevNotify = RegisterDeviceNotification(hWnd, NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE Or DEVICE_NOTIFY_ALL_INTERFACE_CLASSES)
If hDevNotify = 0 Then
MsgBox "RegisterDeviceNotification failed: " & CStr(Err.LastDllError), vbOKOnly
DoRegisterDeviceInterface = False
Exit Function
End If
DoRegisterDeviceInterface = True
End Function
'Place a listbox (Listbox1) on a form (Form1) and add this code In a form
Option ExplicitDim hDevNotify As LongPrivate Sub Form_Load()
Call DoRegisterDeviceInterface(Me.hWnd, hDevNotify)
glngPrevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf MyWindowProc
End SubPrivate Sub Form_Unload(Cancel As Integer)
If hDevNotify <> 0 Then
Call UnregisterDeviceNotification(hDevNotify)
End If
'pass control back to previous windows
SetWindowLong Me.hWnd, GWL_WNDPROC, glngPrevWndProc
End Sub