谁说VB不能进行SubClassing(子类操作)! '由于我没有找到WM_DEVICECHANGE的定义,所以用拦截WM_MOUSEMOVE(鼠标移动)来讲解 以下程序执行后,在窗体上移动鼠标,将弹出带有"SSS"的消息框(VB6测试通过)'以下定义一定写在一般模块中,特别是Public Fuction WndProc(),否则AdderssOf将找不到WndProc()的地址Option Explicit Public Const GWL_WNDPROC = (-4) Public Const WM_MOUSEMOVE = &H200 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 Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public preWndProc As LongPublic 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_MOUSEMOVE '改变这里的Windows消息常数,拦截任何Windows消息 MsgBox "SSS" '拦截到消息后进行操作 Case Else WndProc = CallWindowProc(preWndProc, hWnd, Msg, wParam, lParam) '其他消息由VB处理 End Select End Function'以下为Form_load()及Form_Unload中的程序(注意:程序执行过程中不可以使用调试工具中的任何终止操作,否则将出现非法操作!!) Private Sub Form_Load() preWndProc = GetWindowLong(Form1.hWnd, GWL_WNDPROC) SetWindowLong Form1.hWnd, GWL_WNDPROC, AddressOf WndProc End SubPrivate Sub Form_Unload(Cancel As Integer) SetWindowLong Form1.hWnd, GWL_WNDPROC, preWndProc End Sub
是DELPHI的你也可转为VB。
'由于我没有找到WM_DEVICECHANGE的定义,所以用拦截WM_MOUSEMOVE(鼠标移动)来讲解
以下程序执行后,在窗体上移动鼠标,将弹出带有"SSS"的消息框(VB6测试通过)'以下定义一定写在一般模块中,特别是Public Fuction WndProc(),否则AdderssOf将找不到WndProc()的地址Option Explicit
Public Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEMOVE = &H200
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
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public preWndProc As LongPublic 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_MOUSEMOVE '改变这里的Windows消息常数,拦截任何Windows消息
MsgBox "SSS" '拦截到消息后进行操作
Case Else
WndProc = CallWindowProc(preWndProc, hWnd, Msg, wParam, lParam) '其他消息由VB处理
End Select
End Function'以下为Form_load()及Form_Unload中的程序(注意:程序执行过程中不可以使用调试工具中的任何终止操作,否则将出现非法操作!!)
Private Sub Form_Load()
preWndProc = GetWindowLong(Form1.hWnd, GWL_WNDPROC)
SetWindowLong Form1.hWnd, GWL_WNDPROC, AddressOf WndProc
End SubPrivate Sub Form_Unload(Cancel As Integer)
SetWindowLong Form1.hWnd, GWL_WNDPROC, preWndProc
End Sub
---一个16岁的VB Fan
你可以查看一下MSDN中的说明。光驱关上时会触发一个好象是SystemDevice什么的事件。