(声明:魏滔序原创,转贴请注明出处。)
标准模块(mHook):

VB6实现键盘鼠标全局HookOption Explicit
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
VB6实现键盘鼠标全局Hook
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As LongAs Long
VB6实现键盘鼠标全局Hook
Private Const WM_CANCELJOURNAL = &H4B
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Type POINTAPI
VB6实现键盘鼠标全局Hook    x 
As Long
VB6实现键盘鼠标全局Hook    y 
As Long
VB6实现键盘鼠标全局Hook
End Type
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Type TMSG
VB6实现键盘鼠标全局Hook    hwnd 
As Long
VB6实现键盘鼠标全局Hook    Message 
As Long
VB6实现键盘鼠标全局Hook    wParam 
As Long
VB6实现键盘鼠标全局Hook    lParam 
As Long
VB6实现键盘鼠标全局Hook    
Time As Long
VB6实现键盘鼠标全局Hook    PT 
As POINTAPI
VB6实现键盘鼠标全局Hook
End Type
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Public hJouHook As Long, hAppHook As Long, lpHooker As Long
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Public Function JouHookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As LongAs Long
VB6实现键盘鼠标全局Hook    
If nCode < 0 Then
VB6实现键盘鼠标全局Hook        JouHookProc 
= CallNextHookEx(hJouHook, nCode, wParam, lParam)
VB6实现键盘鼠标全局Hook        
Exit Function
VB6实现键盘鼠标全局Hook    
End If
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook    
Call CallEvent(lpHooker, lParam)
VB6实现键盘鼠标全局Hook    
Call CallNextHookEx(hJouHook, nCode, wParam, lParam)
VB6实现键盘鼠标全局Hook
End Function
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Public Function AppHookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As LongAs Long
VB6实现键盘鼠标全局Hook    
If nCode < 0 Then
VB6实现键盘鼠标全局Hook        AppHookProc 
= CallNextHookEx(hAppHook, nCode, wParam, lParam)
VB6实现键盘鼠标全局Hook        
Exit Function
VB6实现键盘鼠标全局Hook    
End If
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook    
Dim msg As TMSG
VB6实现键盘鼠标全局Hook    CopyMemory msg, ByVal lParam, 
Len(msg)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook    
Select Case msg.Message
VB6实现键盘鼠标全局Hook        
Case WM_CANCELJOURNAL
VB6实现键盘鼠标全局Hook            
If wParam = 1 Then Call CallEvent(lpHooker, WM_CANCELJOURNAL)
VB6实现键盘鼠标全局Hook    
End Select
VB6实现键盘鼠标全局Hook    
Call CallNextHookEx(hAppHook, nCode, wParam, ByVal lParam)
VB6实现键盘鼠标全局Hook
End Function
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub CallEvent(ByVal lpObj As Long, ByVal lParam As Long)
VB6实现键盘鼠标全局Hook    
Dim Hooker As Hooker
VB6实现键盘鼠标全局Hook    CopyMemory Hooker, lpObj, 
4&
VB6实现键盘鼠标全局Hook    Hooker.CallEvent lParam
VB6实现键盘鼠标全局Hook    CopyMemory Hooker, 
0&4&
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook


类模块(Hooker):

VB6实现键盘鼠标全局HookOption Explicit
VB6实现键盘鼠标全局Hook
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As LongAs Long
VB6实现键盘鼠标全局Hook
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
VB6实现键盘鼠标全局Hook
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As LongAs Long
VB6实现键盘鼠标全局Hook
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongAs Long
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Const WH_JOURNALRECORD = &H0
VB6实现键盘鼠标全局Hook
Private Const WH_GETMESSAGE = &H3
VB6实现键盘鼠标全局Hook
Private Const WM_CANCELJOURNAL = &H4B
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Const WM_KEYDOWN = &H100
VB6实现键盘鼠标全局Hook
Private Const WM_KEYUP = &H101
VB6实现键盘鼠标全局Hook
Private Const WM_MOUSEMOVE = &H200
VB6实现键盘鼠标全局Hook
Private Const WM_LBUTTONDOWN = &H201
VB6实现键盘鼠标全局Hook
Private Const WM_LBUTTONUP = &H202
VB6实现键盘鼠标全局Hook
Private Const WM_LBUTTONDBLCLK = &H203
VB6实现键盘鼠标全局Hook
Private Const WM_RBUTTONDOWN = &H204
VB6实现键盘鼠标全局Hook
Private Const WM_RBUTTONUP = &H205
VB6实现键盘鼠标全局Hook
Private Const WM_RBUTTONDBLCLK = &H206
VB6实现键盘鼠标全局Hook
Private Const WM_MBUTTONDOWN = &H207
VB6实现键盘鼠标全局Hook
Private Const WM_MBUTTONUP = &H208
VB6实现键盘鼠标全局Hook
Private Const WM_MBUTTONDBLCLK = &H209
VB6实现键盘鼠标全局Hook
Private Const WM_MOUSEWHEEL = &H20A
VB6实现键盘鼠标全局Hook
Private Const WM_SYSTEMKEYDOWN = &H104
VB6实现键盘鼠标全局Hook
Private Const WM_SYSTEMKEYUP = &H105
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Type EVENTMSG
VB6实现键盘鼠标全局Hook    wMsg 
As Long
VB6实现键盘鼠标全局Hook    lParamL 
As Long
VB6实现键盘鼠标全局Hook    lParamH 
As Long
VB6实现键盘鼠标全局Hook    msgTime 
As Long
VB6实现键盘鼠标全局Hook    hWndMsg 
As Long
VB6实现键盘鼠标全局Hook
End Type
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private EMSG As EVENTMSG
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Public Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
VB6实现键盘鼠标全局Hook
Public Event MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
VB6实现键盘鼠标全局Hook
Public Event MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
VB6实现键盘鼠标全局Hook
Public Event KeyDown(KeyCode As Integer, Shift As Integer)
VB6实现键盘鼠标全局Hook
Public Event KeyUp(KeyCode As Integer, Shift As Integer)
VB6实现键盘鼠标全局Hook
Public Event SysKeyDown(KeyCode As Integer)
VB6实现键盘鼠标全局Hook
Public Event SysKeyUp(KeyCode As Integer)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Public Sub CreateHook()
VB6实现键盘鼠标全局Hook    
If hJouHook = 0 Then hJouHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf JouHookProc, App.hInstance, 0)
VB6实现键盘鼠标全局Hook    
If hAppHook = 0 Then hAppHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf AppHookProc, App.hInstance, App.ThreadID)
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Public Property Get HookState() As Boolean
VB6实现键盘鼠标全局Hook    
If hAppHook = 0 Then
VB6实现键盘鼠标全局Hook        HookState 
= False
VB6实现键盘鼠标全局Hook    
Else
VB6实现键盘鼠标全局Hook        HookState 
= True
VB6实现键盘鼠标全局Hook    
End If
VB6实现键盘鼠标全局Hook
End Property
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Public Sub RemoveHook()
VB6实现键盘鼠标全局Hook    UnhookWindowsHookEx hAppHook: hAppHook 
= 0
VB6实现键盘鼠标全局Hook    UnhookWindowsHookEx hJouHook: hJouHook 
= 0
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Class_Initialize()
VB6实现键盘鼠标全局Hook    lpHooker 
= ObjPtr(Me)
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Class_Terminate()
VB6实现键盘鼠标全局Hook    
If hJouHook Or hAppHook Then RemoveHook
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局HookFriend 
Sub CallEvent(ByVal lParam As Long)
VB6实现键盘鼠标全局Hook    
Dim i As Integer, j As Integer, K As Integer, s As String
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook    
If lParam = WM_CANCELJOURNAL Then
VB6实现键盘鼠标全局Hook        hJouHook 
= 0: CreateHook
VB6实现键盘鼠标全局Hook        
Exit Sub
VB6实现键盘鼠标全局Hook    
End If
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook    CopyMemory EMSG, ByVal lParam, 
Len(EMSG)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook    
Select Case EMSG.wMsg
VB6实现键盘鼠标全局Hook        
Case WM_KEYDOWN
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            s 
= Hex(EMSG.lParamL)
VB6实现键盘鼠标全局Hook            K 
= (EMSG.lParamL And &HFF)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            RaiseEvent KeyDown(K, j)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            s 
= Left$(s, 2& Right$("00" & Hex(K), 2)
VB6实现键盘鼠标全局Hook            EMSG.lParamL 
= CLng("&h" & s)
VB6实现键盘鼠标全局Hook            CopyMemory ByVal lParam, EMSG, 
Len(EMSG)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook        
Case WM_KEYUP
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4)
VB6实现键盘鼠标全局Hook            s 
= Hex(EMSG.lParamL)
VB6实现键盘鼠标全局Hook            K 
= (EMSG.lParamL And &HFF)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            RaiseEvent KeyUp(K, j)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            s 
= Left$(s, 2& Right$("00" & Hex(K), 2)
VB6实现键盘鼠标全局Hook            EMSG.lParamL 
= CLng("&h" & s)
VB6实现键盘鼠标全局Hook            CopyMemory ByVal lParam, EMSG, 
Len(EMSG)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook        
Case WM_MOUSEMOVE
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyLButton) Then i = (i Or 1)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyRButton) Then i = (i Or 2)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyMButton) Then i = (i Or 4)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            RaiseEvent MouseMove(i, j, 
CSng(EMSG.lParamL), CSng(EMSG.lParamH))
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook        
Case WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyShift) Then i = (i Or 1)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyControl) Then i = (i Or 2)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyMenu) Then i = (i Or 4)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            RaiseEvent MouseDown(
2 ^ ((EMSG.wMsg - 513/ 3), i, CSng(EMSG.lParamL), CSng(EMSG.lParamH))
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook        
Case WM_LBUTTONUP, WM_RBUTTONUP, WM_MBUTTONUP
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyShift) Then i = (i Or 1)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyControl) Then i = (i Or 2)
VB6实现键盘鼠标全局Hook            
If GetAsyncKeyState(vbKeyMenu) Then i = (i Or 4)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            RaiseEvent MouseUp(
2 ^ ((EMSG.wMsg - 514/ 3), i, CSng(EMSG.lParamL), CSng(EMSG.lParamH))
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook        
Case WM_SYSTEMKEYDOWN
VB6实现键盘鼠标全局Hook            s 
= Hex(EMSG.lParamL)
VB6实现键盘鼠标全局Hook            K 
= (EMSG.lParamL And &HFF)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            
If K <> vbKeyMenu Then RaiseEvent SysKeyDown(K)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            s 
= Left$(s, 2& Right$("00" & Hex(K), 2)
VB6实现键盘鼠标全局Hook            EMSG.lParamL 
= CLng("&h" & s)
VB6实现键盘鼠标全局Hook            CopyMemory ByVal lParam, EMSG, 
Len(EMSG)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook        
Case WM_SYSTEMKEYUP
VB6实现键盘鼠标全局Hook            s 
= Hex(EMSG.lParamL)
VB6实现键盘鼠标全局Hook            K 
= (EMSG.lParamL And &HFF)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            
If K <> vbKeyMenu Then RaiseEvent SysKeyUp(K)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook            s 
= Left$(s, 2& Right$("00" & Hex(K), 2)
VB6实现键盘鼠标全局Hook            EMSG.lParamL 
= CLng("&h" & s)
VB6实现键盘鼠标全局Hook            CopyMemory ByVal lParam, EMSG, 
Len(EMSG)
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook        
Case Else
VB6实现键盘鼠标全局Hook    
End Select
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook

应网友要求,在此补充示例代码

VB6实现键盘鼠标全局HookOption Explicit
VB6实现键盘鼠标全局Hook
Private WithEvents Hooker As Hooker
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Form_Load()
VB6实现键盘鼠标全局Hook    
Set Hooker = New Hooker
VB6实现键盘鼠标全局Hook    Hooker.CreateHook
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Form_Unload(Cancel As Integer)
VB6实现键盘鼠标全局Hook    Hooker.RemoveHook
VB6实现键盘鼠标全局Hook    
Set Hooker = Nothing
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Hooker_KeyUp(KeyCode As Integer, Shift As Integer)
VB6实现键盘鼠标全局Hook    Debug.Print KeyCode, Shift
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Hooker_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
VB6实现键盘鼠标全局Hook    Debug.Print Button, Shift, x, y
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Hooker_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
VB6实现键盘鼠标全局Hook    Debug.Print Button, Shift, x, y
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Hooker_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
VB6实现键盘鼠标全局Hook    Debug.Print Button, Shift, x, y
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Hooker_SysKeyDown(KeyCode As Integer)
VB6实现键盘鼠标全局Hook    Debug.Print KeyCode
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook
VB6实现键盘鼠标全局Hook
Private Sub Hooker_SysKeyUp(KeyCode As Integer)
VB6实现键盘鼠标全局Hook    Debug.Print KeyCode
VB6实现键盘鼠标全局Hook
End Sub
VB6实现键盘鼠标全局Hook

相关文章: