基于 Windows 消息机制的 VB U盘插拔检测

在 VB 中,可以通过子类化窗口消息处理函数,并监听 WM_DEVICECHANGE 消息来实现对 U 盘插拔事件的检测。以下是具体的实现步骤:

  1. 声明 API 函数:

vb

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private 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

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

  1. 定义常量:

vb

Private Const GWL_WNDPROC = -4

Private Const WM_DEVICECHANGE As Long = &H219

Private Const DBT_DEVICEARRIVAL As Long = &H8000&

Private Const DBT_DEVICEREMOVECOMPLETE As Long = &H8004&

  1. 子类化窗口消息处理函数:

```vb

' 保存原窗口消息处理函数地址

OldWndProc = SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf NewWndProc)

' 新窗口消息处理函数

Public Function NewWndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

' 处理 WM_DEVICECHANGE 消息

If Msg = WM_DEVICECHANGE Then

' 判断 U 盘插拔事件

If wParam = DBT_DEVICEARRIVAL Then

' 处理 U 盘插入事件

ElseIf wParam = DBT_DEVICEREMOVECOMPLETE Then

' 处理 U 盘拔出事件

End If

End If

   ' 调用原窗口消息处理函数
   NewWndProc = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)

End Function

```

在上述代码中,OldWndProc 用于保存原窗口消息处理函数的地址,NewWndProc 是新的窗口消息处理函数,用于拦截 WM_DEVICECHANGE 消息。在 NewWndProc 函数中,根据 wParam 的值判断 U 盘的插拔事件,并进行相应的处理。

  1. 恢复原窗口消息处理函数:

在程序结束前,需要将窗口消息处理函数恢复为原来的函数,以避免程序出错。

vb

SetWindowLong Form1.hwnd, GWL_WNDPROC, OldWndProc

通过以上步骤,即可在 VB 程序中检测到 U 盘的插拔事件。

rar 文件大小:6.69KB