首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB6下的大难题呀,两天了,有哪位高手能帮帮小弟我…懂USB接口的请进。高分悬赏

2012-04-03 
VB6下的大难题呀,两天了,有谁能帮帮我……懂USB接口的请进。高分悬赏!VB code标准模式

VB6下的大难题呀,两天了,有谁能帮帮我……懂USB接口的请进。高分悬赏!

VB code
'===========标准模式============Option ExplicitType GUID    Data1   As Long    Data2   As Integer    Data3   As Integer    Data4(7)   As ByteEnd Type    '固定常数Type DEV_BROADCAST_DEVICEINTERFACE    dbcc_size   As Long    dbcc_devicetype   As Long    dbcc_reserved   As Long    dbcc_classguid   As GUID    dbcc_name   As LongEnd Type    '规定的常数Type DEV_BROADCAST_VOLUME    dbcv_size   As Long    dbcv_devicetype   As Long    dbcv_reserved   As Long    dbcv_unitmask   As Long    dbcv_flags   As IntegerEnd Type    '规定的常数Const GWL_WNDPROC = -4Const DEVICE_NOTIFY_WINDOW_HANDLE = 0Const WM_DEVICECHANGE = &H219&Const DBT_DEVTYP_DEVICEINTERFACE = &H5&Const DBT_DEVTYP_VOLUME = &H2&Const DBT_DEVICEARRIVAL = &H8000&Const DBT_DEVICEREMOVECOMPLETE = &H8004&Const DRIVE_REMOVABLE = 2Const DRIVE_NO_ROOT_DIR = 1Declare Function SetWindowLongA Lib "User32.dll " (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongDeclare 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 LongDeclare Function RegisterDeviceNotificationA Lib "User32.dll " (ByVal hRecipient As Long, NotificationFilter As Any, ByVal Flags As Long) As LongDeclare Function UnregisterDeviceNotification Lib "User32.dll " (ByVal Handle As Long) As LongDeclare Sub RtlMoveMemory Lib "kernel32 " (Destination As Any, Source As Any, ByVal Length As Long)Private m_hwnd     As LongPrivate m_lpPrevWndProc     As LongPrivate m_hDevNotify     As LongPublic Sub RegDevNotify(ByVal hwnd As Long)           '注册钩子    Dim dbcc     As DEV_BROADCAST_DEVICEINTERFACE    If m_lpPrevWndProc = 0 Then          m_hwnd = hwnd          m_lpPrevWndProc = SetWindowLongA(m_hwnd, GWL_WNDPROC, AddressOf WndProc)          dbcc.dbcc_size = Len(dbcc)          dbcc.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE          m_hDevNotify = RegisterDeviceNotificationA(hwnd, dbcc, DEVICE_NOTIFY_WINDOW_HANDLE)    End IfEnd SubPublic Sub UnregDevNotify()      '解除钩子    If m_lpPrevWndProc Then          UnregisterDeviceNotification m_hDevNotify          SetWindowLongA m_hwnd, GWL_WNDPROC, m_lpPrevWndProc          m_lpPrevWndProc = 0    End IfEnd SubPrivate 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           [color=#FF0000]'打印变量值[/color]        Debug.Print wParam        [color=#FF0000]'打印变量值[/color]        Debug.Print lParam        [color=#FF0000]'打印变量值[/color]          If wParam = DBT_DEVICEARRIVAL Or wParam = DBT_DEVICEREMOVECOMPLETE Then                  '当标志是插入一个磁盘 或者 移动完成                MsgBox ("USB Changed !!")          End If    End If    WndProc = CallWindowProcA(m_lpPrevWndProc, m_hwnd, msg, wParam, lParam)               '返回消息给系统 否则系统所有消息都被拦截 你的电脑几乎就是废了 关机都不行End Function'===============调用==============Sub Form_Load()    RegDevNotify Me.hwnd     '向系统注册一个拦截优盘状态的钩子End SubSub Form_Unload(Cancel As Integer)    UnregDevNotify  '解除钩子End Sub



经过拔插USB设备,调试打印的3个变量值,其中:
msg = 537
wParam = 7(并非预期的&H8000或者&H8004)
lParam =0

代码网上很多,但都试了,情况都是这样,有人说要注册什么的,但解决方法都不成功,希望在此能得到帮助,感激!

[解决办法]
USB插拔的系统消息肯定是可以获取到的。
[解决办法]
参阅一下这个
[解决办法]
按说明拷贝下面代码到新的工程,拿个U盘插拔测试

一切正常!
'===========标准模块============
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 Sub RegDevNotify(ByVal hwnd As Long) '注册钩子
' Dim dbcc As DEV_BROADCAST_DEVICEINTERFACE
' If m_lpPrevWndProc = 0 Then
' m_hwnd = hwnd
' m_lpPrevWndProc = SetWindowLongA(m_hwnd, GWL_WNDPROC, AddressOf WndProc)
' dbcc.dbcc_size = Len(dbcc)
' dbcc.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE
' m_hDevNotify = RegisterDeviceNotificationA(hwnd, dbcc, DEVICE_NOTIFY_WINDOW_HANDLE)
' End If
'End Sub
'
'Public Sub UnregDevNotify() '解除钩子
' If m_lpPrevWndProc Then
' UnregisterDeviceNotification m_hDevNotify
' SetWindowLongA m_hwnd, GWL_WNDPROC, m_lpPrevWndProc
' m_lpPrevWndProc = 0
' End If
'End Sub


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 '打印变量值[/color]
Debug.Print wParam '打印变量值[/color]
Debug.Print lParam '打印变量值[/color]
' 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

''===============调用==============
'Sub Form_Load()
' RegDevNotify Me.hwnd '向系统注册一个拦截优盘状态的钩子
'End Sub
'
'Sub Form_Unload(Cancel As Integer)
' UnregDevNotify '解除钩子
'End Sub

'窗口代码
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

热点排行