الاستشعار بمجرد وصل أو فصل أجهزة تخزين USB باستخدام الحدث WndProc الخاص بالنظام (ويمكن الإستفادة منه في أمور كثيرة)
mdlWndProc.bas
كود :
Option Explicit
Private Const WM_DEVICECHANGE As Integer = &H219
' WndProc declares & functions ============================================
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As
Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal HWnd As Long, ByVal Msg As Long,
ByVal WParam As Long, ByVal LParam As Long) As Long
Private Declare Function GetProp Lib "user32.dll" Alias "GetPropA" (ByVal HWnd As Long, ByVal lpString As String) As Long
Private Declare Function SetProp Lib "user32.dll" Alias "SetPropA" (ByVal HWnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
Private Declare Function RemoveProp Lib "user32.dll" Alias "RemovePropA" (ByVal HWnd As Long, ByVal lpString As String) As Long
Private Const GWL_WNDPROC = -4
Private Function WndProc(ByVal HWnd As Long, ByVal Msg As Long, ByVal WParam As Long, ByVal LParam As Long) As Long
Select Case Msg
Case WM_DEVICECHANGE ' Device changed تغيير الأجهزة
Call DeviceChanged(WParam, LParam)
End Select
WndProc = CallWindowProc(GetProp(HWnd, "PrevWndProc"), HWnd, Msg, WParam, LParam)
End Function
Public Sub WndProcHook(ByVal HWnd As Long)
On Error Resume Next
SetProp HWnd, "PrevWndProc", SetWindowLong(HWnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
Public Sub WndProcUnHook(ByVal HWnd As Long)
On Error Resume Next
SetWindowLong HWnd, GWL_WNDPROC, GetProp(HWnd, "PrevWndProc")
RemoveProp HWnd, "PrevWndProc"
End Sub