大虾们,帮帮忙~~麻烦了     VB中回调函数怎么用?我这里回调的时候出现错误还望大虾指点 Public   Function   EnumWindowsProc_1(hwnd   As   Long,   lParam   As   Long)   As   Long 
'Private   Function   EnumWindowsProc_1(hwnd   As   Long,   lparam   As   Long) 
Dim   lpWinTitle(256)   As   String 
Dim   m_strTitle   As   String 
GetWindowText   hwnd,   lpWinTitle,   256   -   1 
m_strTitle   =   CStr(lpWinTitle) 
If   GetEdHnd   =   False   Then 
      FNamdeEditHnd   =   hwnd 
      SendMessage   FNamdeEditHnd,   WM_SETTEXT,   Len(sfile),   CLng(sfile) 
      GetEdHnd   =   True 
End   If 
If   (GetEdHnd   =   True)   And   (m_strTitle   =   "OK")   Then 
        BTOkHnd   =   hwnd 
End   If 
If   m_strTitle   =   "1"   Then 
      Bt1Hnd   =   hwnd 
      SendMessage   Bt1Hnd,   WM_SETFOCUS,   0,   0 
      PostMessage   Bt1Hnd,   BM_CLICK,   0,   0 
      PostMessage   Bt1Hnd,   BM_CLICK,   0,   0 
End   If 
EnumWindowsProc_1   =   True 
End   Function 调用时候 
If   EnumChildWindows(IGBHnd,   GetAddress(AddressOfEnumWindowsProc_1),   0)   =   0   Then 
                                MessageBox   MyHnd,   "Enum   file   name   editor   fail",   "",   0 
End   IfPublic Function GetAddress(ByVal add As Long) As Long
GetAddress = add
End Function

解决方案 »

  1.   

    回调函数参数不对,参数太少了。
    参考一下我的回调函数(已经调试过没有问题):Public Function WndProc(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_LBUTTONDBLCLK   Then   '截获鼠标双击消息 
                            Dim   r   As   Long 
                            On   Error   Resume   Next 
                            If   (Player.PDFullScreen)   Then 
                                    r   =   ShowWindow(PlayScreen.Hwnd,   SW_SHOWMINIMIZED) '最小化 
                            Else 
                                    r   =   ShowWindow(PlayScreen.Hwnd,   SW_SHOWMAXIMIZED) '最大化 
                            End   If 
                      Else 
                            If   Msg   =   WM_RBUTTONDOWN   Then   '弹出右键菜单 
                                  PlayScreen.PopupMenu   PlayScreen.PlayMenu 
                            Else 
                                  If   Msg   =   WM_LBUTTONDOWN   And   LockMouseLeftClick   =   False   Then   '单击鼠标左键激活播放器 
                                        If   ClickMouse   Then 
                                              Call   SetWindowPos(Player.hwnd,   HWND_TOPMOST,   0,   0,   0,   0,   3) 
                                              Call   ShowWindow(Player.hwnd,   SW_RESTORE) 
                                              ClickMouse   =   False 
                                        Else 
                                              ClickMouse   =   True 
                                        End   If 
                                  Else 
                                        WndProc   =   CallWindowProc(prevWndProc,   hwnd,   Msg,   wParam,lParam)   '操作系统预定义窗口处理程序 
                                  End   If 
                            End   If 
                      End   If 
    End Function 
      

  2.   

    回调函数调用方法:
    参见我的问题(里面5楼):
    http://topic.csdn.net/u/20070212/10/4643bcca-8dbf-49e6-b2f5-cc765eb24e35.html
      

  3.   

    chenjl1031(东方之珠)高手,不行啊  我都试过好多次了  不知道哪出现问题  
      

  4.   

    一运行到If       EnumChildWindows(IGBHnd,       GetAddress(AddressOfEnumWindowsProc_1),       0)       =       0       Then   
    这个语句 程序就崩溃了  addressof  内存出错
      

  5.   

    GetAddress() 做什麼用?addressof 就是得到 函數 的地址了。
      

  6.   

    编译错误,操作符addressof 使用无效
     If EnumChildWindows(IGBHnd, AddressOf EnumWindowsProc_1, 0) = 0 Then
        MessageBox MyHnd, "Enum file name editor fail", "", 0
     End If
    能不能说下哪错了,这与回调函数参数没什么关系吧?我改参数出现同样问题
      

  7.   

    你的回调函数应该这样写:Public Function EnumWindowsProc_1(ByVal hwnd As Long,ByVal Msg As Long,ByVal wParam As   Long,ByVal lParam As Long) As Long   '自定义窗口处理程序   ................................End Function
    调用方法是:必须用SetWindowLong来调用prevWndProc=SetWindowLong(hWnd,GWL_WNDPROC,AddressOf EnumWindowsProc_1) 调用成功,prevWndProc不为0。你那种调用方法我没见过!另外:编写回调函数(先存盘),不能用调试的方法,否则会崩溃!
      

  8.   

    看你的写法不像是响应鼠标。
    参考一下我的写法:
    Public hWndOfPlayVideo As Long'视频播放窗口的句柄 '取得Flash.ocx控件视频播放窗口的句柄 
    Public Function EnumFlashChildProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long 
            Dim RetVal As Long 
            Dim WinClassBuf As String * 255 
            Dim WinClass As String 
            RetVal=GetClassName(lhWnd,WinClassBuf,255) 
            If (InStr(WinClassBuf, Chr(0))>0) Then 
               WinClass=Left(WinClassBuf,InStr(WinClassBuf,Chr(0))-1) 
            End If 
            If WinClass="MacromediaFlashPlayerActiveX" Then 
                  hWndOfPlayVideo=lhWnd 
                  EnumChildProc=False 
            Else 
                  If Left(WinClass,4)="ATL:" Then 
                        hWndOfPlayVideo=lhWnd 
                        EnumChildProc=False 
                  Else 
                        EnumChildProc=True 
                  End If 
            End If 
    End Function 
    lhWnd=PlayScreen.hwnd 
    lRet=EnumChildWindows(lhWnd, AddressOf EnumFlashChildProc, lParam) 
    If hWndOfPlayVideo< >0 Then 
       prevWndProc=SetWindowLong(hWndOfPlayVideo,GWL_WNDPROC,AddressOf WndProc) 
    End If 
    CJL=hWndOfPlayVideo     
      

  9.   

    楼主这个回调函数是不是用作枚举窗体中的子窗体?
    那看看我这个吧,我这个是枚举MDI中的子窗体的'这个是我自定义的枚举
    Enum ECWA
        ECW_CLOSEALL = &H1 '关闭所有子窗口
        '为子窗口增加菜单(这个你就不要看了,没有我程序中的其他代码你是看不明白的)
        'MDI主窗体中的菜单一般都有一个名为“窗口”的菜单,里面列出了所有子窗体的名称
        '这里我不使用默认的,而是自己制作这个“窗口”菜单
        ECW_ADDMENU = &H2 
        ECW_WINDOWEXIST = &H4 '判断子窗口是否存在
    End Enum
    '这个也是我自定义的类型,用作传给回调函数中的lParam
    Type ENUMCHILDWINDOW
        Action  As ECWA
        lParam  As Long '通常用作存储窗口句柄或其他附加参数
        lReturn As Long '返回值
    End TypeFunction EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean
        Static i As Integer
        Dim ECW As ENUMCHILDWINDOW
        Dim MII As MENUITEMINFO
        Dim lngParent As Long
        Dim strBuffer As String
        
        EnumChildProc = True
        
        lngParent = GetParent(hWnd)    If lngParent = 0 Or lngParent <> MDIClient Then Exit Function
        
        MII.cbSize = Len(MII)
        MII.fMask = MIIM_STATE Or MIIM_FTYPE Or MIIM_STRING Or MIIM_ID
        MII.fType = MFT_STRING
        
        CopyMemory ECW, ByVal lParam, Len(ECW)
        
        Select Case ECW.Action
            Case ECW_CLOSEALL
                If hWnd <> ECW.lParam Then
                    SndMsg hWnd, WM_CLOSE, 0&, 0&
                    If IsWindow(hWnd) = 1 Then EnumChildProc = False
                End If
            Case ECW_ADDMENU
                If i = 0 Then MII.fState = MFS_CHECKED
                MII.wID = hWnd
                MII.dwTypeData = "&" & i + 1 & " " & GetWindowText(hWnd)
                InsertMenuItem glngSubMenu, i + 4, True, MII
                i = i + 1
                If GetWindow(hWnd, GW_HWNDNEXT) = 0 Then
                    ECW.lReturn = i
                    i = 0
                End If
            Case ECW_WINDOWEXIST
                If ECW.lParam > UBound(gWC) Or ECW.lParam < LBound(gWC) Then EnumChildProc = False
                If GetWindowText(hWnd) = byte2Str(gWC(ECW.lParam).Caption) Then
                    SndMsg MDIClient, WM_MDIACTIVATE, hWnd, ByVal 0&
                    ECW.lReturn = True
                    EnumChildProc = False
                End If
        End Select
        
        CopyMemory ByVal lParam, ECW, Len(ECW)
        CopyMemory ECW, 0&, Len(ECW)
    End Function
    '下面是调用:
    'ECW.Action = ECW_WINDOWEXIST '检查子窗口是否存在
    'ECW.lParam = hWnd_Child '传入子窗口举柄
    'hWndParent 为父窗体句柄
    'Call EnumChildWindows(hWndParent, AddressOf EnumChildProc, ByVal ECW)
    '若ECW.lReturn=0则表示子窗口不存在,否则表示存在
    'ECW.Action = ECW_CLOSEALL '关闭所有子窗体
    'EnumChildWindows hWndParent, AddressOf EnumChildProc, ByVal ECW慢慢研究研究
      

  10.   

    EnumChildWindows中的第二个参数,可以直接传地址:AddressOf xxxxxx
    而不用另外获得函数地址这么麻烦的
    除非是一些类型中定义的值,例如注册类中的类型:Private Type WNDCLASS
        style As Long
        lpfnwndproc As Long '这个就需要用到你的GetAddress函数了
        cbClsextra As Long
        cbWndExtra2 As Long
        hInstance As Long
        hIcon As Long
        hCursor As Long
        hbrBackground As Long
        lpszMenuName As String
        lpszClassName As String
    End Type
      

  11.   

    Public Function EnumWindowsProc_1(hwnd As Long, lparam As Long) As Boolean         ' 发文件ww到另软件打开,
    On Error Resume Next
    Dim lpWinTitle(256) As Byte
    Dim m_strTitle As String
    'Dim hIput As Long
    GetWindowText hwnd, lpWinTitle, 256 - 1  '
    m_strTitle = CStr(lpWinTitle)
    If GetEdHnd = False Then
       FNamdeEditHnd = hwnd
       SendMessage FNamdeEditHnd, WM_SETTEXT, LenB(ww), CLng(ww)     ' 发文件ww到另软件打开,  把文件名发送到窗体
       GetEdHnd = True
    End If
    If (GetEdHnd = True) And (m_strTitle = "OK") Then       ' 发生成功后确定
        BTOkHnd = hwnd
    End If
    If m_strTitle = "1" Then                                   
       Bt1Hnd = hwnd
       SendMessage Bt1Hnd, WM_SETFOCUS, 0, 0
       PostMessage Bt1Hnd, BM_CLICK, 0, 0
       PostMessage Bt1Hnd, BM_CLICK, 0, 0
    End If
    EnumWindowsProc_1 = True
    End Function
    这个回调函数
    我调用的时候
    就是用
     If Bt1Hnd = 0 Then                                                         '把文件用另一软件打开。
            If EnumChildWindows(IGBHnd, AddressOf EnumWindowsProc_1, 0) = 0 Then   '枚举Imput Gerber的所有窗口
               MessageBox MyHnd, "Enum file name editor fail", "", 0
           End If
    可能回调函数错了,我在VC编的时候运行没有问题,可怎么在VB中运行就有问题
      

  12.   

    C++程序如下:
    BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam)   //
    {
    char lpWinTitle[256];
    ::GetWindowText(hwnd,lpWinTitle,256-1);
    string m_strTitle=(string)lpWinTitle;
    if(GetEdHnd==FALSE)
    {
         FNamdeEditHnd=hwnd;
    //     char   buf[]="e:\\ouyang\\GERBER\\GBX\\MA009S0707001.GBX";
     ::SendMessage(FNamdeEditHnd,WM_SETTEXT,strlen(buf),(LPARAM)buf);
         GetEdHnd=TRUE;
    }
    if((GetEdHnd==TRUE)&&(m_strTitle=="OK"))
    {
            BtOkHnd=hwnd;
    } if(m_strTitle=="1")
    {
          Bt1Hnd=hwnd;
          ::SendMessage(Bt1Hnd,WM_SETFOCUS,0,0);
          ::PostMessage(Bt1Hnd,BM_CLICK,0,0);
          ::PostMessage(Bt1Hnd,BM_CLICK,0,0);
    } return TRUE;
    }
    运行没有问题
    调用的时候:  if(Bt1Hnd==0)
     {
        if(::EnumChildWindows(IGBHnd,EnumWindowsProc_1,0)==0)
         ::MessageBox(MyHnd,"Enum file name editor fail","",0);
     }
     可是怎么用VB就有问题