工程中有一个窗体和一个模块,窗体中有一个Timer控件,默认值为True,Interval=1000
窗体(from1.frm)的代码:
Private Sub Form_Load()
Hook Me.hwnd
End Sub
Private Sub Timer1_Timer()
Dim t As Long
t = TempHwnd
Call GetCursorPos(CursorPosition)
TempHwnd = WindowFromPoint(CursorPosition.X, CursorPosition.Y)
Debug.Print TempHwnd
If TempHwnd = t Then
Exit Sub
Else
UnHook t
Hook TempHwnd
Debug.Print "TempHwnd--", TempHwnd
End If
End Sub模块Module1.bas的代码:
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Public 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
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Type POINTAPI
X As Long
Y As Long
End Type
Public Const GWL_WNDPROC = (-4)
Public CursorPosition As POINTAPI
Public TempHwnd As Long
Public Const WM_MOUSEWHEEL = &H20A
Global lpPrevWndProcPublic Sub Hook(ByVal hwnd As Long)
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End SubPublic Sub UnHook(ByVal hwnd As Long)
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Debug.Print "uMsg--", uMsg
End Function
窗体(from1.frm)的代码:
Private Sub Form_Load()
Hook Me.hwnd
End Sub
Private Sub Timer1_Timer()
Dim t As Long
t = TempHwnd
Call GetCursorPos(CursorPosition)
TempHwnd = WindowFromPoint(CursorPosition.X, CursorPosition.Y)
Debug.Print TempHwnd
If TempHwnd = t Then
Exit Sub
Else
UnHook t
Hook TempHwnd
Debug.Print "TempHwnd--", TempHwnd
End If
End Sub模块Module1.bas的代码:
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Public 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
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Type POINTAPI
X As Long
Y As Long
End Type
Public Const GWL_WNDPROC = (-4)
Public CursorPosition As POINTAPI
Public TempHwnd As Long
Public Const WM_MOUSEWHEEL = &H20A
Global lpPrevWndProcPublic Sub Hook(ByVal hwnd As Long)
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End SubPublic Sub UnHook(ByVal hwnd As Long)
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Debug.Print "uMsg--", uMsg
End Function
Debug.Print "uMsg--", uMsg
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Form1.Print "uMsg--", uMsg
Select Case uMsg
Case WM_MOUSEWHEEL
'这里加入消息函数,是控间的滚动条滚动
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function
Form1.Print "uMsg--", uMsg
Select Case uMsg
Case WM_MOUSEWHEEL
'这里加入消息函数,是控间的滚动条滚动
If wParam > 0 Then
Debug.Print "向上滚动"
Else
Debug.Print "向下滚动"
End If
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Select
End Function
现在能捕获到滚轮事件,可我怎么才能知道它是往前滚还是往后滚?
下边是MouseHookProc:
Public Function MouseHookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case nCode
Case HC_ACTION
If wParam = WM_MOUSEWHEEL Then
Dim mStru As MOUSEHOOKSTRUCT
CopyMemory mStru, lParam, LenB(mStru)
'这里的代码怎么写啊?
End If
End Select
End Function
pt As POINTAPI
hwnd As Long
wHitTestCode As Long
dwExtraInfo As Long
End Type' 这里增加一个类型声明
Private Type MOUSEHOOKSTRUCTEX
MHS As MOUSEHOOKSTRUCT
mouseData As Long
End TypePublic Function MouseHookProc(ByVal nCode As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case nCode
Case HC_ACTION
If wParam = WM_MOUSEWHEEL Then
' 这里的声明改为新增加的
Dim mStru As MOUSEHOOKSTRUCTEX
' 这里拷贝的内存应为传值
CopyMemory mStru, ByVal lParam, LenB(mStru)
' 这里的代码应该这么写
If mStru.mouseData < 0 Then
Debug.Print "向下滚动"
Else
Debug.Print "向上滚动"
End If
End If
End Select
End Function' 可以结贴了吧,呵呵。