If IsHaveParameter = True Then
      '带参数的情况在此执行
      ExecuteAPI = CallWindowProc(GetCodeStart(hProcAddress, OutputArray), 0, 1, 2, 3)
  Else
      '不带参数的情况在此执行
      ExecuteAPI = CallWindowProc(hProcAddress, 0, 1, 2, 3)
  End If
我在学习动态调用api的类,没看懂callwindowproc这个api函数(各参数的意义等)
哪位大牛给解释下,谢谢

解决方案 »

  1.   

    CallWindowProc  函数功能:该函数CallWindowProc将消息信息传送给指定的窗口过程。
      函数原型:LRESULT CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam);
      参数:
      lpPrevWndFunc:指向前一个窗口过程的指针。如果该值是通过调用GetWindowLong函数,并将该函数中的nlndex参数设为GWL_WNDPROC或DWL_DLGPROC而得到的,那么它实际上要么是窗口或者对话框的地址,要么就是代表该地址的句柄。
      hWnd:指向接收消息的窗口过程的句柄。
      Msg:指定消息类型。
      wParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。
      IParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。
      返回值:返回值指定了消息处理结果,它与发送的消息有关。
      备注:使用函数CallWindowsProc可进行窗口子分类。通常来说,同一类的所有窗口共享一个窗口过程。子类是一个窗口或者相同类的一套窗口,在其消息被传送到该类的窗口过程之前,这些消息是由另一个窗口过程进行解释和处理的。
      SetWindowLoog函数通过改变与特定窗口相关的窗日过程,使系统调用新的窗口过程来创建子类,新的窗口过程替换了以前的窗口过程。应用程序必须通过调用CallWindowsProc来将新窗日过程没有处理的任何消息传送到以前的窗口过程中,这样就允许应用程序创建一系列窗口过程。
      如果定义了STRICT,那么lpPrevWndFunc参数具有WNDPROC数据类型。WNDPROC类型说明如下:
      LRESULT(CALLBACK· WNDPROC)(HWND, UINT WPARAM,LPARAM)
      如果没有定义STRICT,那么lpPrevWndFunc参数具有FARPROC数据类型。FARPROC类型说明如下:int(FAR WINAPL·FARPROC)()
      在C语言中,FARPROC申明表示为一个没有指定参数表的回调函数。然而在 C++中;申明中的空参数表示该函数没有参数。这种微妙的区别有可能引起代码出错。下面是一种解决办法:#ifdef STRICT;WNDPROC MyWindowProcedure;#else;FARPROC MyindowProcedure;#endif IResult=CallWindowProc(MyWindowProcedure,…)
      有关该函数的空参数表方面进一步的信息,清参考Bjarne Stroustrup编写的C++编程语言第2版。
      对于Windows NT:函数CallWindowsProc function进行了Unicode至ANSf转换处理。如果你直接调用该窗口过程,那么无法利用该转换。
      速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:user32.lib:Unicode:在Windows NT环境中以Unicode和ANSI版本实现。
      

  2.   

    CallWindowProc多数情况下是用在窗口处理程序中(编写自己的窗口处理程序)。
    Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long                                         '自定义窗口处理程序
            Dim r     As Long
            On Error Resume Next        If Msg = WM_LBUTTONDBLCLK Then           '截获鼠标双击消息
               '处理程序
            Else
                  If Msg = WM_RBUTTONDOWN Then           '弹出右键菜单
                     Form1.PopupMenu Form1.PlayMenu
                  Else
                     If Msg = WM_LBUTTONDOWN Then     '单击鼠标左键
                        '处理程序
                     End If
                         Else
                              WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)  '操作系统预定义窗口处理程序
                     End If
                  End If
            End If
    End Function
      

  3.   

    看起来是我blog的代码,呵呵
    其实你看函数声明就应该知道基本的含义了,其实这个函数主要就是第一个参数比较重要,
    后面的基本按Windows消息机制来发送相关的消息如果你要调用的函数不需要用消息通知系统或其他窗口,那么后面的消息写什么都影响不大
    hWnd为0,就是说不向某个指定的窗口发消息,
    至于后面的Msg、wParam、IParam 参数,全部为0都可以,
    当然,你随便写参数也可以,只要类型匹配不益处,都没什么问题
    因为那条消息是发不出去的,原因是hWnd为0,呵呵
      

  4.   

    CallWindowProc 函数的定义是这样的
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" 
    (ByVal lpPrevWndFunc As Long, 
    ByVal hWnd As Long, 
    ByVal Msg As Long, 
    ByVal wParam As Long, 
    ByVal lParam As Long) As LonglpPrevWndFunc  参数主要是指向你要调用的函数句柄
    hWnd 参数是指窗口句柄
    Msg 参数是指消息类别
    wParam 参数是指消息的参数
    lParam 参数也是指消息的参数在下面这一句里
    ExecuteAPI = CallWindowProc(hProcAddress, 0, 1, 2, 3)你可以这么来看
    ExecuteAPI = CallWindowProc(hProcAddress,  //是 lpPrevWndFunc 参数
        0,  //是 hWnd 参数
        1,  //是 Msg 参数
        2,  //是 wParam 参数
        3) //是 lParam 参数hWnd 既然为 0,表示是无效的窗口句柄,即后面的参数怎么设置都是无效的
    因为消息根本就发不出去,不会有窗口的句柄为0,所以后面的消息也不会有
    窗口能收到,所以后面的 Msg、wParam、lParam 可以随便填写内容
    所以即使是
    ExecuteAPI = CallWindowProc(hProcAddress, 0, 777, 888, 999)
    这样都是没问题的但是,如果你想发消息给某个窗口,就可以按照 Windows 消息的基本参数来设置,
    如 WM_QUIT、WM_CLOSE 等等消息给你指定的窗口。
    例(调用完函数后关闭掉 Form1 这个窗口):
    ExecuteAPI = CallWindowProc(hProcAddress, Form1.hWnd, WM_CLOSE, 0, 0)
    这样 Form1 这个窗口收到 WM_CLOSE 消息后就会关闭了,当然,如果你的句柄是资源管理
    器或任务栏,他们也会关闭掉。但是消息单不是这么用的,上面只是说明一下消息机制里的参
    数设置而已。如果你想了解更多有关 Windows 消息的有关知识,可以搜索 SendMessage、
    PostMessage 等函数的使用方法,这是专门的 Windows 消息处理函数。