
VB6.0开发平台下,如何捕获USB设备的插入或者拔出消息。(有代码) 100
'===========标准模块============OptionExplicitTypeGUIDData1AsLongData2AsIntegerData3AsInt...
'===========标准模块============
Option Explicit
Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type '固定常数
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 Type '规定的常数
Type DEV_BROADCAST_VOLUME
dbcv_size As Long
dbcv_devicetype As Long
dbcv_reserved As Long
dbcv_unitmask As Long
dbcv_flags As Integer
End Type '规定的常数
Public Const GWL_WNDPROC = -4
Const DEVICE_NOTIFY_WINDOW_HANDLE = 0
Const WM_DEVICECHANGE = &H219&
Const DBT_DEVTYP_DEVICEINTERFACE = &H5&
Const DBT_DEVTYP_VOLUME = &H2&
Const DBT_DEVICEARRIVAL = &H8000&
Const DBT_DEVICEREMOVECOMPLETE = &H8004&
Const DRIVE_REMOVABLE = 2
Const DRIVE_NO_ROOT_DIR = 1
Public Declare Function SetWindowLongA Lib "User32.dll " (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProcA Lib "User32.dll " (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function RegisterDeviceNotificationA Lib "User32.dll " (ByVal hRecipient As Long, NotificationFilter As Any, ByVal Flags As Long) As Long
Declare Function UnregisterDeviceNotification Lib "User32.dll " (ByVal Handle As Long) As Long
Declare Sub RtlMoveMemory Lib "kernel32 " (Destination As Any, Source As Any, ByVal Length As Long)
Private m_hwnd As Long
Private m_lpPrevWndProc As Long
Private m_hDevNotify As Long
Public lpPrev As Long
Public Function WndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '消息拦截 当有消息时候会在这里出现
If msg = WM_DEVICECHANGE Then '当消息是 磁盘发生改变
Debug.Print msg '打印变量值
Debug.Print wParam '打印变量值
Debug.Print lParam '打印变量值
If wParam = DBT_DEVICEARRIVAL Or wParam = DBT_DEVICEREMOVECOMPLETE Then '当标志是插入一个磁盘 或者 移动完成
MsgBox ("USB Changed !!")
End If
End If
WndProc = CallWindowProcA(lpPrev, hwnd, msg, wParam, lParam) '返回消息给系统 否则系统所有消息都被拦截 你的电脑几乎就是废了 关机都不行
End Function
''===============调用==============
'窗口代码
Option Explicit
Private Sub Form_Load()
lpPrev = SetWindowLongA(hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
If lpPrev <> 0 Then
lpPrev = SetWindowLongA(hwnd, GWL_WNDPROC, lpPrev)
lpPrev = 0
End If
End Sub
U盘插入和停止的时候都有呀,(用USB蓝牙测试)
537 32768 265552432
537 32772 68952560
但我的设备插入拔出的时候就没有,
537
7
0
537
7
0
537
7
0
537
7
0
估计是什么问题呀?USB设备运行正常,以前用C++写的程序能正常捕获插入或者拔出消息,但这次在VB6.0上测试不行。。。 展开
Option Explicit
Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type '固定常数
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 Type '规定的常数
Type DEV_BROADCAST_VOLUME
dbcv_size As Long
dbcv_devicetype As Long
dbcv_reserved As Long
dbcv_unitmask As Long
dbcv_flags As Integer
End Type '规定的常数
Public Const GWL_WNDPROC = -4
Const DEVICE_NOTIFY_WINDOW_HANDLE = 0
Const WM_DEVICECHANGE = &H219&
Const DBT_DEVTYP_DEVICEINTERFACE = &H5&
Const DBT_DEVTYP_VOLUME = &H2&
Const DBT_DEVICEARRIVAL = &H8000&
Const DBT_DEVICEREMOVECOMPLETE = &H8004&
Const DRIVE_REMOVABLE = 2
Const DRIVE_NO_ROOT_DIR = 1
Public Declare Function SetWindowLongA Lib "User32.dll " (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProcA Lib "User32.dll " (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function RegisterDeviceNotificationA Lib "User32.dll " (ByVal hRecipient As Long, NotificationFilter As Any, ByVal Flags As Long) As Long
Declare Function UnregisterDeviceNotification Lib "User32.dll " (ByVal Handle As Long) As Long
Declare Sub RtlMoveMemory Lib "kernel32 " (Destination As Any, Source As Any, ByVal Length As Long)
Private m_hwnd As Long
Private m_lpPrevWndProc As Long
Private m_hDevNotify As Long
Public lpPrev As Long
Public Function WndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '消息拦截 当有消息时候会在这里出现
If msg = WM_DEVICECHANGE Then '当消息是 磁盘发生改变
Debug.Print msg '打印变量值
Debug.Print wParam '打印变量值
Debug.Print lParam '打印变量值
If wParam = DBT_DEVICEARRIVAL Or wParam = DBT_DEVICEREMOVECOMPLETE Then '当标志是插入一个磁盘 或者 移动完成
MsgBox ("USB Changed !!")
End If
End If
WndProc = CallWindowProcA(lpPrev, hwnd, msg, wParam, lParam) '返回消息给系统 否则系统所有消息都被拦截 你的电脑几乎就是废了 关机都不行
End Function
''===============调用==============
'窗口代码
Option Explicit
Private Sub Form_Load()
lpPrev = SetWindowLongA(hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
If lpPrev <> 0 Then
lpPrev = SetWindowLongA(hwnd, GWL_WNDPROC, lpPrev)
lpPrev = 0
End If
End Sub
U盘插入和停止的时候都有呀,(用USB蓝牙测试)
537 32768 265552432
537 32772 68952560
但我的设备插入拔出的时候就没有,
537
7
0
537
7
0
537
7
0
537
7
0
估计是什么问题呀?USB设备运行正常,以前用C++写的程序能正常捕获插入或者拔出消息,但这次在VB6.0上测试不行。。。 展开
2个回答
展开全部
有啊,我试了一下,插入U盘跳出三次信息,拔出U盘跳两次,这里改一下:
If Msg = WM_DEVICECHANGE Then
If wParam = DBT_DEVICEARRIVAL Or wParam = DBT_DEVICEREMOVECOMPLETE Then
Debug.Print "Msg="; Msg; " wParam="; wParam; " lParam="; lParam '打印变量值
'在这里写打开设备以及判断、处理代码
MsgBox "USB Changed !!"
End If
End If
If Msg = WM_DEVICECHANGE Then
If wParam = DBT_DEVICEARRIVAL Or wParam = DBT_DEVICEREMOVECOMPLETE Then
Debug.Print "Msg="; Msg; " wParam="; wParam; " lParam="; lParam '打印变量值
'在这里写打开设备以及判断、处理代码
MsgBox "USB Changed !!"
End If
End If
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询