当前位置:编程学习 > VB >>

VB API函数解析

帮忙解析下下面三个函数,为什么只需要在FORM_LOAD中调用一次HOOKWHEEL以后的它 就自动调用,并可以完成功能,详细点,初接触接受能力有限

Public Function pvWindowProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo errH

Select Case wMsg

Case WM_MOUSEWHEEL
If Not CtlWheel Is Nothing Then
If TypeOf CtlWheel Is MSFlexGrid Then
With CtlWheel

Select Case wParam
Case Is > 0

If CtlWheel.TopRow > 0 Then
CtlWheel.TopRow = CtlWheel.TopRow - 1
End If

Case Else

CtlWheel.TopRow = CtlWheel.TopRow + 1

End Select
End With
End If

End If
End Select

errH:

pvWindowProc = CallWindowProc(m_OldWindowProc, hwnd, wMsg, wParam, lParam)
End Function
Public Sub HookWheel(ByVal frmHwnd)
m_OldWindowProc = SetWindowLong(frmHwnd, GWL_WNDPROC, AddressOf pvWindowProc)
End Sub

Public Sub UnHookWheel(ByVal hwnd As Long)
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, m_OldWindowProc)
End Sub
追问:是鼠标滚轮的,大致我也看得懂,我不明白的是pvWindowProc这个函数如何取得那些参数值的
答案:
这是一个VB自身窗体的HOOK
'因为有些类型定义你这里没有,我就不说是什么了
'这里是新的接收消息的函数
Public Function pvWindowProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'出错就跳到errH这一行,在下面
On Error GoTo errH
'对消息进行选择。wMsg是消息类型
Select Case wMsg
'这个是滚轮消息?好像是
Case WM_MOUSEWHEEL
'这里应该是滚动屏幕吧
If Not CtlWheel Is Nothing Then
If TypeOf CtlWheel Is MSFlexGrid Then
With CtlWheel
'在一个选择里面有另一个选择
Select Case wParam
Case Is > 0

If CtlWheel.TopRow > 0 Then
'大于0,就-1
CtlWheel.TopRow = CtlWheel.TopRow - 1
End If

Case Else
'否则加1
CtlWheel.TopRow = CtlWheel.TopRow + 1

End Select
End With
End If

End If
End Select
'如果出错就跳到这里运行
errH:
'按原地址运行
pvWindowProc = CallWindowProc(m_OldWindowProc, hwnd, wMsg, wParam, lParam)
End Function

'安装HOOK
Public Sub HookWheel(ByVal frmHwnd)
'把让消息转到指定的地址
'AddressOf pvWindowProc,意思就是pvWindowProc这个函数所在地址
'就是上面的那个函数
m_OldWindowProc = SetWindowLong(frmHwnd, GWL_WNDPROC, AddressOf pvWindowProc)
End Sub


'卸载HOOK
Public Sub UnHookWheel(ByVal hwnd As Long)
Dim lngReturnValue As Long
'这个值返回的是非零的,说明操作成功
'和上面那一步相反,是把Proc调回刚才的地址
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, m_OldWindowProc)
End Sub

总体看来,可能是一个获取鼠标滚轮消息的一个HOOK

上一个:VB是什么?
下一个:VB自动查找功能

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,