这几段代码来来自VB_IDE鼠标插件源码
我想要问的是这哪两段代码的工作流程 和 每句的意思比如说 在 HookActiveCodePane 中 SetWindowLong 的 "AddressOf CodePaneProc" 传递的是什么 CodePaneProc 又是怎么接收的??如果要全代码的话可以回贴(我想应该都有把..呵呵...)如果回答的满意的话可以在加分... 希望高手们赐教..本人先在此谢谢了'######################################################################################################################
'##
'## 功能: 自定义消息处理函数(钩子函数)
'##
'## 参数: hWnd :窗体句柄
'## nMsg :消息
'## wParam :wParam参数
'## lParam :lParam参数
'##
'######################################################################################################################
Private Function CodePaneProc(ByVal hWnd As Long, ByVal nMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim TopLn As Long
Dim NumLines As Long
Dim ScrollTo As Long CodePaneOriginalProcPtr = GetProp(hWnd, PropName)
If CodePaneOriginalProcPtr Then
CodePaneProc = CallWindowProc(CodePaneOriginalProcPtr, hWnd, nMsg, wParam, lParam) 'call the original winproc to do what has to be done
Select Case nMsg 'and now split on message type
Case WM_KILLFOCUS
RemoveProp hWnd, PropName 'so remove the property
SetWindowLong hWnd, IDX_WINDOWPROC, CodePaneOriginalProcPtr
HookActiveCodePane 'and finally hook the code pane which is now active
Case WM_MOUSEWHEEL 'hah! there it is, that's what it's all about - the user fingers the mouse wheel
If wParam And 1 Then
fSetOpts.Show vbModal
Unload fSetOpts
Else 'NOT WPARAM...
If Not VBInstance.ActiveCodePane Is Nothing Then '错误修复-我们有一个滚动的codepane
With VBInstance.ActiveCodePane
TopLn = .TopLine
Select Case LinesToScroll
Case "-2"
NumLines = .CountOfVisibleLines * ScrollFraction
Case "-1"
NumLines = .CountOfVisibleLines - 1
Case Else
NumLines = Abs(Val(LinesToScroll))
If NumLines >= .CountOfVisibleLines Then NumLines = .CountOfVisibleLines - 1
End If
End Select
If NumLines < 1 Then
NumLines = 1
End If
ScrollTo = TopLn - Sgn(wParam) * NumLines / ((wParam And &HFFFF&) \ 4 + 1) If ScrollTo = TopLn Then
ScrollTo = TopLn - Sgn(wParam)
End If
With .CodeModule
Select Case ScrollTo
Case Is < 1
ScrollTo = 1
Case Is > .CountOfLines
ScrollTo = .CountOfLines
End Select
End With '.CODEMODULE
If Smooth Then
Do
TopLn = TopLn + Sgn(ScrollTo - TopLn)
Sleep 1
.TopLine = TopLn
Loop Until TopLn = ScrollTo
Else 'SMOOTH = FALSE/0
.TopLine = ScrollTo
End If
End With 'VBINSTANCE.ACTIVECODEPANE
End If
End If
End Select
End If
End Function
'#####################################################################################################
'## 功能: 当前代码窗体钩子函数
'#####################################################################################################
Public Sub HookActiveCodePane()
hWndActiveCodePane = FindWindow("VbaWindow", vbNullString) '先获取SDI窗体的hWnd
If hWndActiveCodePane = 0 Then
'否则为MDI模式,获取最上层的子窗体hWnd,类名为“MDIClient”
hWndActiveCodePane = FindWindowEx(VBInstance.MainWindow.hWnd, 0, "MDIClient", vbNullString)
End If
If hWndActiveCodePane Then '发现一个窗体(应该是代码窗体)
SetProp hWndActiveCodePane, PropName, GetWindowLong(hWndActiveCodePane, IDX_WINDOWPROC) '存储当前窗体的默认消息处理函数地址指针到窗体的一个属性中(用于后期恢复用)
SetWindowLong hWndActiveCodePane, IDX_WINDOWPROC, AddressOf CodePaneProc '指向自定义的消息处理函数
End If
End Sub
我想要问的是这哪两段代码的工作流程 和 每句的意思比如说 在 HookActiveCodePane 中 SetWindowLong 的 "AddressOf CodePaneProc" 传递的是什么 CodePaneProc 又是怎么接收的??如果要全代码的话可以回贴(我想应该都有把..呵呵...)如果回答的满意的话可以在加分... 希望高手们赐教..本人先在此谢谢了'######################################################################################################################
'##
'## 功能: 自定义消息处理函数(钩子函数)
'##
'## 参数: hWnd :窗体句柄
'## nMsg :消息
'## wParam :wParam参数
'## lParam :lParam参数
'##
'######################################################################################################################
Private Function CodePaneProc(ByVal hWnd As Long, ByVal nMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim TopLn As Long
Dim NumLines As Long
Dim ScrollTo As Long CodePaneOriginalProcPtr = GetProp(hWnd, PropName)
If CodePaneOriginalProcPtr Then
CodePaneProc = CallWindowProc(CodePaneOriginalProcPtr, hWnd, nMsg, wParam, lParam) 'call the original winproc to do what has to be done
Select Case nMsg 'and now split on message type
Case WM_KILLFOCUS
RemoveProp hWnd, PropName 'so remove the property
SetWindowLong hWnd, IDX_WINDOWPROC, CodePaneOriginalProcPtr
HookActiveCodePane 'and finally hook the code pane which is now active
Case WM_MOUSEWHEEL 'hah! there it is, that's what it's all about - the user fingers the mouse wheel
If wParam And 1 Then
fSetOpts.Show vbModal
Unload fSetOpts
Else 'NOT WPARAM...
If Not VBInstance.ActiveCodePane Is Nothing Then '错误修复-我们有一个滚动的codepane
With VBInstance.ActiveCodePane
TopLn = .TopLine
Select Case LinesToScroll
Case "-2"
NumLines = .CountOfVisibleLines * ScrollFraction
Case "-1"
NumLines = .CountOfVisibleLines - 1
Case Else
NumLines = Abs(Val(LinesToScroll))
If NumLines >= .CountOfVisibleLines Then NumLines = .CountOfVisibleLines - 1
End If
End Select
If NumLines < 1 Then
NumLines = 1
End If
ScrollTo = TopLn - Sgn(wParam) * NumLines / ((wParam And &HFFFF&) \ 4 + 1) If ScrollTo = TopLn Then
ScrollTo = TopLn - Sgn(wParam)
End If
With .CodeModule
Select Case ScrollTo
Case Is < 1
ScrollTo = 1
Case Is > .CountOfLines
ScrollTo = .CountOfLines
End Select
End With '.CODEMODULE
If Smooth Then
Do
TopLn = TopLn + Sgn(ScrollTo - TopLn)
Sleep 1
.TopLine = TopLn
Loop Until TopLn = ScrollTo
Else 'SMOOTH = FALSE/0
.TopLine = ScrollTo
End If
End With 'VBINSTANCE.ACTIVECODEPANE
End If
End If
End Select
End If
End Function
'#####################################################################################################
'## 功能: 当前代码窗体钩子函数
'#####################################################################################################
Public Sub HookActiveCodePane()
hWndActiveCodePane = FindWindow("VbaWindow", vbNullString) '先获取SDI窗体的hWnd
If hWndActiveCodePane = 0 Then
'否则为MDI模式,获取最上层的子窗体hWnd,类名为“MDIClient”
hWndActiveCodePane = FindWindowEx(VBInstance.MainWindow.hWnd, 0, "MDIClient", vbNullString)
End If
If hWndActiveCodePane Then '发现一个窗体(应该是代码窗体)
SetProp hWndActiveCodePane, PropName, GetWindowLong(hWndActiveCodePane, IDX_WINDOWPROC) '存储当前窗体的默认消息处理函数地址指针到窗体的一个属性中(用于后期恢复用)
SetWindowLong hWndActiveCodePane, IDX_WINDOWPROC, AddressOf CodePaneProc '指向自定义的消息处理函数
End If
End Sub
解决方案 »
- 如何声明socket函数呢?
- 如何判断WebBrowser.Navigate打开的那个页面已经完全打开、正在打开,或已经被关闭?
- 新手求助:如何使用listbox?
- [100分全部送]该贴子的朋友进来
- 请问我该怎么做?先谢谢各位!
- 请教一个问题!!!!用什么方法最快将一个图片填满Picturebox!!!!
- 有个关于ADO Data 控件和DataGrid控件结合使用的问题!
- vb如何把自己写入或者读取信息的文件改为其他属性?
- 如何实现这样的功能:无论当前活动窗口是什么,当我输入某一按键组合(如CTRL+A)时,自动激活我的已经运行的程序?
- 关于局域网的问题!只要关注者就有分,反正快开学了,只要大虾能决绝这个问题,狂送!一定做到!!急死我了:-(
- vb关于自符串分解问题
- 键盘扫描码.
如果想真正了解的话,需要学习API的.
那个太复杂,是用C语言写的玩意儿.
如果想真正了解的话,需要学习API的.
那个太复杂,是用C语言写的玩意儿.
是一个钩子函数,也就是一个回调函数.
http://www.codeuu.com/VB_IDE_MouseWheel_(Fixed)