在模块中:Option Explicit '----------------------------------------------- ' modHook.bas 由站长亲自编写的一个最简单的Hook程 ' 序,只需要在WinProc过程中的Select Case语句中加 ' 入需要拦截的Windows消息,以及你需要完成操作的代 ' 码,就可以实现你的Hook程序。 ' ' 由任何疑问请Email: [email protected] '----------------------------------------------- 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 SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = (-4) Public Const WM_SETFOCUS = &H7Private OldProc& Private mhWnd&'================================================== '回调 Function WinProc&(ByVal hWnd&, ByVal wMsg&, _ ByVal wParam&, ByVal lParam&)
Select Case wMsg Case WM_SETFOCUS Exit Function End Select
WinProc& = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam) End Function '================================================== '================================================== '挂钩 Sub Hook(ByVal nhWnd&) If OldProc <> 0 Then Exit Sub
mhWnd& = nhWnd&
OldProc = SetWindowLong(nhWnd&, GWL_WNDPROC, AddressOf WinProc)End Sub '================================================== '================================================== '脱钩 Sub UnHook() If OldProc = 0 Then Exit Sub SetWindowLong mhWnd, GWL_WNDPROC, OldProc OldProc = 0 End Sub '================================================== 在窗口中:Option ExplicitPrivate Sub Form_Load() Hook cmdNoFocus.hWnd End SubPrivate Sub Form_Unload(Cancel As Integer) UnHook End Sub
'-----------------------------------------------
' modHook.bas 由站长亲自编写的一个最简单的Hook程
' 序,只需要在WinProc过程中的Select Case语句中加
' 入需要拦截的Windows消息,以及你需要完成操作的代
' 码,就可以实现你的Hook程序。
'
' 由任何疑问请Email: [email protected]
'-----------------------------------------------
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 SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_SETFOCUS = &H7Private OldProc&
Private mhWnd&'==================================================
'回调
Function WinProc&(ByVal hWnd&, ByVal wMsg&, _
ByVal wParam&, ByVal lParam&)
Select Case wMsg
Case WM_SETFOCUS
Exit Function
End Select
WinProc& = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)
End Function
'==================================================
'==================================================
'挂钩
Sub Hook(ByVal nhWnd&) If OldProc <> 0 Then Exit Sub
mhWnd& = nhWnd&
OldProc = SetWindowLong(nhWnd&, GWL_WNDPROC, AddressOf WinProc)End Sub
'==================================================
'==================================================
'脱钩
Sub UnHook() If OldProc = 0 Then Exit Sub SetWindowLong mhWnd, GWL_WNDPROC, OldProc
OldProc = 0
End Sub
'==================================================
在窗口中:Option ExplicitPrivate Sub Form_Load()
Hook cmdNoFocus.hWnd
End SubPrivate Sub Form_Unload(Cancel As Integer)
UnHook
End Sub
本人为这个问题已经开了二个100分的帖了,问题一解决,二帖的分数都给解决者。望高手不吝赐教。
http://community.csdn.net/Expert/topic/4240/4240265.xml?temp=8.73965E-03