我的程序功能是在窗体中滚动鼠标中键时,每转动一次,在窗体中的数字就加1,不过我的程序有时在捕捉时有点慢,滚动中健时数字不变化,代码如下:
公共模块:
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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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 Long
Public Const GWL_WNDPROC = -4&
Public Const WM_MOUSEWHEEL = &H20A
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 Type POINTAPI
x As Long
y As Long
End Type
Public OldWindowProc As Long '用来保存系统默认的窗口消息处理函数的地址
Public hwndTextBox As Long '用来保存form的句柄
Public iNum as Integer
'自定义的消息处理函数
Public Function NewWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
If Msg = WM_MOUSEWHEEL Then
'下面得到鼠标位置处的对象的句柄
Dim CurPoint As POINTAPI, hwndUnderCursor As Long
GetCursorPos CurPoint
hwndUnderCursor = WindowFromPoint(CurPoint.x, CurPoint.y)
'如果鼠标位于Form1内部,则对鼠标滚轮事件进行处理
If hwndUnderCursor = hwndTextBox Then
If wParam = -7864320 Then '向下滚动
inum=cint(form1.lblnum.caption)
inum=inum+1
form1.lblnum.caption=inum
ElseIf wParam = 7864320 Then '向上滚动
Form1.lblRightNum = CInt(Form1.lblRightNum) + 1
inum=cint(form1.lblnum.caption)
inum=inum-1
form1.lblnum.caption=inum End If
End If
Else
'调用form1的默认窗口消息处理函数
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
End If
End Function程序窗体代码:
Private Sub Form_Load()
'取得窗体的句柄
hwndTextBox = Form1.hwnd
'保存默认窗口消息处理函数地址
OldWindowProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
'将窗体消息处理函数指定为自定义函数NewWindowProc
Call SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
End Sub
公共模块:
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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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 Long
Public Const GWL_WNDPROC = -4&
Public Const WM_MOUSEWHEEL = &H20A
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 Type POINTAPI
x As Long
y As Long
End Type
Public OldWindowProc As Long '用来保存系统默认的窗口消息处理函数的地址
Public hwndTextBox As Long '用来保存form的句柄
Public iNum as Integer
'自定义的消息处理函数
Public Function NewWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
If Msg = WM_MOUSEWHEEL Then
'下面得到鼠标位置处的对象的句柄
Dim CurPoint As POINTAPI, hwndUnderCursor As Long
GetCursorPos CurPoint
hwndUnderCursor = WindowFromPoint(CurPoint.x, CurPoint.y)
'如果鼠标位于Form1内部,则对鼠标滚轮事件进行处理
If hwndUnderCursor = hwndTextBox Then
If wParam = -7864320 Then '向下滚动
inum=cint(form1.lblnum.caption)
inum=inum+1
form1.lblnum.caption=inum
ElseIf wParam = 7864320 Then '向上滚动
Form1.lblRightNum = CInt(Form1.lblRightNum) + 1
inum=cint(form1.lblnum.caption)
inum=inum-1
form1.lblnum.caption=inum End If
End If
Else
'调用form1的默认窗口消息处理函数
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
End If
End Function程序窗体代码:
Private Sub Form_Load()
'取得窗体的句柄
hwndTextBox = Form1.hwnd
'保存默认窗口消息处理函数地址
OldWindowProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
'将窗体消息处理函数指定为自定义函数NewWindowProc
Call SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
End Sub
公共模块:
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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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 Long
Public Const GWL_WNDPROC = -4&
Public Const WM_MOUSEWHEEL = &H20A
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 Type POINTAPI
x As Long
y As Long
End Type
Public OldWindowProc As Long '用来保存系统默认的窗口消息处理函数的地址
Public hwndTextBox As Long '用来保存form的句柄
Public iNum As Integer
'自定义的消息处理函数
Public Function NewWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
If Msg = WM_MOUSEWHEEL Then
'下面得到鼠标位置处的对象的句柄
Dim CurPoint As POINTAPI, hwndUnderCursor As Long
GetCursorPos CurPoint
hwndUnderCursor = WindowFromPoint(CurPoint.x, CurPoint.y)
'如果鼠标位于Form1内部,则对鼠标滚轮事件进行处理
If hwndUnderCursor = hwndTextBox Then
If wParam = -7864320 Then '向下滚动
iNum = CInt(Form1.lblNum.Caption)
iNum = iNum + 1
Form1.lblNum.Caption = iNum
ElseIf wParam = 7864320 Then '向上滚动
iNum = CInt(Form1.lblNum.Caption)
iNum = iNum - 1
Form1.lblNum.Caption = iNum End If
End If
Else
'调用form1的默认窗口消息处理函数
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
End If
End Function'窗体模块:
Private Sub Form_Load()
lblNum.Caption = 1
'取得窗体的句柄
hwndTextBox = Form1.hwnd
'保存默认窗口消息处理函数地址
OldWindowProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
'将窗体消息处理函数指定为自定义函数NewWindowProc
Call SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
End Sub
只不过这段代码必须用鼠标才行,用我的笔记本电脑的触摸板不行,
原因是使用触摸板的时候,hwndUnderCursor = WindowFromPoint(CurPoint.x, CurPoint.y)返回hwndUnderCursor不是程序窗口的hwnd,通不过If hwndUnderCursor = hwndTextBox Then这句判断
去掉Form1.lblRightNum = CInt(Form1.lblRightNum) + 1(不知道干什么用的)
纯属估计,并无实据,仅供参考