CallWindowProcA 函数 (winuser.h)

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

语法

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

参数

[in] lpPrevWndFunc

类型: WNDPROC

上一个窗口过程。 如果此值是通过调用 GetWindowLong 函数获取的,且 nIndex 参数设置为 GWL_WNDPROCDWL_DLGPROC,则它实际上是窗口或对话框过程的地址,或者是仅对 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 [仅限桌面应用]
目标平台 Windows
标头 winuser.h (包括 Windows.h)
Library User32.lib
DLL User32.dll
API 集 ext-ms-win-ntuser-window-l1-1-4 (在 Windows 10 版本 10.0.14393 中引入)

请参阅

概念性

GetWindowLong

引用

SetClassLong

SetWindowLong

窗口过程