CallWindowProcA 函数 (winuser.h)

将消息信息传递到指定的窗口过程。

语法

LRESULT CallWindowProcA(
  [in] WNDPROC lpPrevWndFunc,
  [in] HWND    hWnd,
  [in] UINT    Msg,
  [in] WPARAM  wParam,
  [in] LPARAM  lParam
);

参数

[in] lpPrevWndFunc

类型:WNDPROC

上一个窗口过程。 如果通过使用设置为 GWL_WNDPROCDWL_DLGPROCnIndex 参数调用 GetWindowLong 函数来获取此值,则它实际上是窗口或对话框过程的地址,或者仅 CallWindowProc有意义的特殊内部值。

[in] hWnd

类型:HWND

用于接收消息的窗口过程的句柄。

[in] Msg

类型:UINT

消息。

[in] wParam

类型:WPARAM

其他特定于消息的信息。 此参数的内容取决于 Msg 参数的值。

[in] lParam

类型:LPARAM

其他特定于消息的信息。 此参数的内容取决于 Msg 参数的值。

返回值

类型:LRESULT

返回值指定消息处理的结果,具体取决于发送的消息。

言论

CallWindowProc 函数用于窗口子类。 通常,具有相同类的所有窗口共享一个窗口过程。 子类是一个窗口或一组窗口,其消息被另一个窗口过程(或过程)截获和处理,然后传递给该类的窗口过程。

SetWindowLong 函数通过更改与特定窗口关联的窗口过程来创建子类,从而导致系统调用新窗口过程而不是上一个窗口过程。 应用程序必须通过调用 CallWindowProc,将新窗口过程未处理的任何消息传递给上一个窗口过程。 这允许应用程序创建窗口过程链。

如果定义了 STRICT,则 lpPrevWndFunc 参数的数据类型 WNDPROCWNDPROC 类型声明如下:

LRESULT (CALLBACK* WNDPROC) (HWND, UINT, WPARAM, LPARAM); 

如果未定义 STRICT,则 lpPrevWndFunc 参数的数据类型 FARPROCFARPROC 类型声明如下:

int (FAR WINAPI * FARPROC) () 

在 C 中,FARPROC 声明指示具有未指定参数列表的回调函数。 但在C++中,声明中的空参数列表指示函数没有参数。 这种微妙的区别可能会破坏粗心的代码。 下面是处理这种情况的一种方法:

#ifdef STRICT 
  WNDPROC MyWindowProcedure 
#else 
  FARPROC MyWindowProcedure 
#endif 
... 
  lResult = CallWindowProc(MyWindowProcedure, ...) ; 

有关使用空参数列表声明的函数的详细信息,请参阅 Bjarne Stroustrup C++ 编程语言第二版

CallWindowProc 函数处理 Unicode 到 ANSI 转换。 如果直接调用窗口过程,则不能利用此转换。

例子

有关示例,请参阅 子类化窗口

注意

winuser.h 标头将 CallWindowProc 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows 2000 Professional [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
目标平台 窗户
标头 winuser.h (包括 Windows.h)
User32.lib
DLL User32.dll
API 集 ext-ms-win-ntuser-window-l1-1-4(在 Windows 10 版本 10.0.14393 中引入)

另请参阅

概念

GetWindowLong

参考

SetClassLong

SetWindowLong

窗口过程