原文链接 -> 传送门
函数功能:
CallWindowProc 函数用于给指定的窗口过程传送消息信息。
API 函数原型:
注释:_In_ 说明该参数是输入的。
LRESULT WINAPI CallWindowProc( _In_ WNDPROC lpPrevWndFunc, _In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam );
参数解析:
|
参数 |
含义 |
|
lpPrevWndFunc |
1. 指向前一个窗口过程的指针 |
|
hWnd |
指向将接收消息的窗口过程的句柄 |
|
Msg |
将发送的消息 |
|
wParam |
消息附加信息。该参数的内容取决于 Msg 参数的值 |
|
lParam |
消息附加信息。该参数的内容取决于 Msg 参数的值 |
返回值:
返回值指定了消息处理的结果,并且取决于发送的消息。
备注:
1. 使用 CallWindowProc 函数可进行窗口子类化。通常,同一类的所有窗口共享一个窗口过程。子类化是同一类的一个窗口或者一组窗口,在其消息被传送到该类的窗口过程之前,这些消息被另一个窗口过程(或一些窗口过程)解释并处理。
2. SetWindowLong 函数通过改变与特定窗口相关联的窗口过程,使系统调用新的窗口过程而不是之前的窗口过程来创建子类。应用程序必须通过调用 CallWindowProc 函数来将新窗口过程中任何没有处理的消息传送到之前的窗口过程中。这样就允许应用程序创建一个窗口过程链。
3. 如果定义了 STRICT,那么 lpPrevWndFunc 参数具有 WNDPROC 数据类型。WNDPROC 类型定义如下:
LRESULT (CALLBACK* WNDPROC) (HWND, UINT, WPARAM, LPARAM);
4. 如果没有定义 STRICT,那么 lpPrevWndFunc 参数具有 FARPROC 数据类型。FARPROC 类型定义如下:
int (FAR WINAPI * FARPROC) ()
5. 在 C 语言中,FARPROC 申明为一个没有指定参数列表的回调函数。然而在 C++ 中,申明中的空参数表示该函数没有参数。这种微妙的区别可能会使粗心的代码出错。下面是一种解决这种情况的办法:
#ifdef STRICT WNDPROC MyWindowProcedure #else FARPROC MyWindowProcedure #endif ... lResult = CallWindowProc(MyWindowProcedure, ...) ;
6. 有关该函数的空参数列表方面的进一步的信息,请参考 Bjarne Stroustrup 编写的《The C++ Programming Language》第2版。
7. CallWindowProc 函数处理了 Unicode 到 ANSI 的转换。如果你直接调用该窗口过程,你将不能利用该转换。
需求:
|
Minimum supported client |
Windows 2000 专业版 [仅桌面应用程序] |
|
Minimum supported server |
Windows 2000 服务器版 [仅桌面应用程序] |
|
Header |
Winuser.h (包含于 Windows.h) |
|
Library |
User32.lib |
|
DLL |
User32.dll |
|
Unicode and ANSI names |
CallWindowProcW (Unicode) 和 CallWindowProcA (ANSI) |




