代码如下:
窗体中:
Option Explicit
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const GWL_WNDPROC As Long = -4
Private Const WM_VSCROLL As Long = &H115
Private Sub Form_Load()
SetWindowLong RichTextBox1.hwnd, GWL_WNDPROC, AddressOf winproc
End Sub
模块中:
Option Explicit
Function winproc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If msg = WM_VSCROLL Then
Form1.Caption = "开始动了"
End If
WindowProc = CallWindowProc(lPrevWndProc, hwnd, msg, wParam, ByVal lParam)
End Function
为什么程序一运行就退出,还有,能真楚的讲一讲回调函数吗?我下是很明白,
窗体中:
Option Explicit
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const GWL_WNDPROC As Long = -4
Private Const WM_VSCROLL As Long = &H115
Private Sub Form_Load()
SetWindowLong RichTextBox1.hwnd, GWL_WNDPROC, AddressOf winproc
End Sub
模块中:
Option Explicit
Function winproc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If msg = WM_VSCROLL Then
Form1.Caption = "开始动了"
End If
WindowProc = CallWindowProc(lPrevWndProc, hwnd, msg, wParam, ByVal lParam)
End Function
为什么程序一运行就退出,还有,能真楚的讲一讲回调函数吗?我下是很明白,
2、回调函数是自定义的函数或过程,如你已经定义的:winproc
3、你的程序中的错误出在:在模块中直接引用了(Form1)Form1.Caption = "开始动了"
应该通过对象引用...
Public Const WM_VSCROLL As Long = &H115
--------------------------------------------------------------
这是类的对象吗...
象这样引用:
模块中:
Public Function aaa(bbb As Form)
bbb.Caption = "ggggg"
End Function
窗体代码:
Private Sub Form_Load()
Call aaa(Form1)
End Sub
因你在模块中调用了CallWindowProc函数..
建议将所有引用的API函数和常量,改为公有,放到模块中.
另:如果你要传递象 bbb As Form 这样的参数,应该修改你自定义的函数:winproc
可能错误的地方1:Private Const GWL_WNDPROC As Long = -4|应该是public
2:lPrevWndProc 函数地址从哪儿来的,应该加 public lPrevWndProc as long
lPrevWndProc = SetWindowLong(RichTextBox1.hwnd, GWL_WNDPROC, AddressOf winproc)
3:WindowProc = CallWindowProc(lPrevWndProc, hwnd, msg, wParam, ByVal lParam)?
应该是 winproc=CallWindowProc(lPrevWndProc, hwnd, msg, wParam, ByVal lParam)
Option Explicit
Private Sub Form_Load()
lPrevWndProc = SetWindowLong(RichTextBox1.hwnd, GWL_WNDPROC, AddressOf winproc)
End SubMODULE:
Option Explicit
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" 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 Const GWL_WNDPROC As Long = -4
Public Const WM_VSCROLL As Long = &H115
Public lPrevWndProc As Long
Public Function winproc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If msg = WM_VSCROLL Then
Label1.Caption = "开始动了"
End If
winproc = CallWindowProc(lPrevWndProc, hwnd, msg, wParam, ByVal lParam)
End Function
//lPrevWndProc = SetWindowLong(RichTextBox1.hwnd, GWL_WNDPROC, AddressOf winproc)
调用完了之后又
//winproc = CallWindowProc(lPrevWndProc, hwnd, msg, wParam, ByVal lParam)你开始记录的lPrevWndProc是个什么?后面再返回这个不是地址的地址,当然会报错。
应该
lPrevWndProc = GetWindowLong(RichTextBox1.hwnd, GWL_WNDPROC)
SetWindowLong(RichTextBox1.hwnd, GWL_WNDPROC, AddressOf winproc)
然后在回调函数里返回原来的地址 lPrevWndProc。
窗体卸载的时候不要忘了
SetWindowLong RichTextBox1.hwnd, GWL_WNDPROC, lPrevWndProc
//Label1.Caption = "开始动了"假设你的窗体名为form1,则改为:
form1.Label1.Caption = "开始动了"
即可