代码如下:
窗体中:
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
为什么程序一运行就退出,还有,能真楚的讲一讲回调函数吗?我下是很明白,

解决方案 »

  1.   

    1、首先:AddressOf是回调函数操作符,不是回调函数,它的作用是传递自定义的函数或过程到API函数中.
    2、回调函数是自定义的函数或过程,如你已经定义的:winproc
    3、你的程序中的错误出在:在模块中直接引用了(Form1)Form1.Caption = "开始动了"
    应该通过对象引用...
      

  2.   

    通过对象引用?我把它改为Label1.Caption="开始动了"还是一样
      

  3.   

    CallWindowProc 这个API写在模块中,公用的。
      

  4.   

    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 WM_VSCROLL As Long = &H115
      

  5.   

    通过对象引用?我把它改为Label1.Caption="开始动了"还是一样
    --------------------------------------------------------------
    这是类的对象吗...
    象这样引用:
    模块中:
    Public Function aaa(bbb As Form)
    bbb.Caption = "ggggg"
    End Function
    窗体代码:
    Private Sub Form_Load()
    Call aaa(Form1)
    End Sub
      

  6.   

    同意dongge2000(秋日私语:非[版务].灌!) 
    因你在模块中调用了CallWindowProc函数..
    建议将所有引用的API函数和常量,改为公有,放到模块中.
    另:如果你要传递象 bbb As Form 这样的参数,应该修改你自定义的函数:winproc
      

  7.   

    lPrevWndProc = SetWindowLong(RichTextBox1.hwnd, GWL_WNDPROC, AddressOf winproc)
      

  8.   

    你程序里面有错误,VB想中断,但中断不了,所以死掉了。
    可能错误的地方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)
      

  9.   

    我看了那么多楼的回答谢谢大家先,不过,我改成以下,问题还是一样:FORM:
    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
      

  10.   

    你先是
    //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
      

  11.   

    至于helanshan(C++)老兄说的引用,好象根本没那回事。在模块里引用窗体的属性方法和变量,就跟窗体间的调用是一样的。比如在模块设定FORM1中Label1的CAPTION,只要FORM1.Label1.Caption = "开始动了"就可以了
      

  12.   

    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 该成PUBLIC
      

  13.   

    //我看了那么多楼的回答谢谢大家先,不过,我改成以下,问题还是一样:呵呵,在你语句的基础上再修改一下就可以了,你的这句有问题:
    //Label1.Caption = "开始动了"假设你的窗体名为form1,则改为:
    form1.Label1.Caption = "开始动了"
    即可