原文链接 -> 传送门
函数功能:
SetWindowLong 函数用于改变指定窗口的属性,该函数也设置在窗口额外存储空间中指定偏移量处的 32 位(long)值。
注意:该函数已经被 SetWindowLongPtr 函数代替。为了使代码同时兼容 32 位和 64 位版本的 Windows,请使用SetWindowLongPtr 函数。
API 函数原型:
注释:_In_ 说明该参数是输入的。
LONG WINAPI SetWindowLong( _In_ HWND hWnd, _In_ int nIndex, _In_ LONG dwNewLong );
参数解析:
|
参数 |
含义 |
||||||||||||||||||||||
|
hWnd |
指定目标窗口的句柄,间接的指向窗口所属的窗口类 |
||||||||||||||||||||||
|
nIndex |
1. 要设置的偏移量的值,并且值从 0 开始。有效值的范围从 0 到窗口额外存储空间的字节数减去一个整形数据的大小。要设置任意其他值,指定下列值之一:
|
||||||||||||||||||||||
|
dwNewLong |
替换值 |
返回值:
1. 如果函数调用成功,返回值为指定的 32 位整数的原来的值;
2. 如果函数调用失败,返回值为 0。设置有关错误的更多信息,请调用 GetLastError 函数。
3. 如果指定 32 位整数的原来的值为 0,并且函数调用成功,则返回值为 0,但是函数并不清除最后的错误信息。这就很难判断函数是否成功。为了解决这个问题,你应该在调用 SetWindowLong 函数之前以参数 0 调用 SetLastError 函数来清除最后的错误信息。这样,如果函数失败就会返回 0,并且 GetLastError 返回一个非 0 值。
备注:
1. 某些窗口数据是被缓存的,所以你调用 SetWindowLong 函数做出的改变直到调用 SetWindowPos 函数才会生效,如果您更改任何帧样式,你必须设置使缓存正确更新的 SWP_FRAMECHANGED 标志位来调用 SetWindowPos 函数。
2. 如果调用带有 GWL_WNDPROC 索引的 SetWindowLong 函数来替换窗口过程,则窗口过程必须符合 WindowProc 回调函数说明部分指定的指南。
3. 如果调用带有 DWL_MSGRESULT 索引的 SetWindowLong 函数来设置由对话框过程处理的消息的返回值,你应该在这之后立即返回 TRUE。否则,如果你调用了其他任何函数而导致对话框过程接收到一个窗口消息,则嵌套的窗口消息可能覆写使用 DWL_MSGRESULT 设定的返回值。
4. 调用带有 GWL_WNDPROC 索引的 SetWindowLong 函数来创建一个窗口类的子类,并且该窗口类用于创建窗口。一个应用程序可以子类化一个系统类,但是不能子类化一个其他进程产生的窗口类。SetWindowLong 函数通过改变与一个特殊的窗口类相联系的窗口过程来创建窗口子类,从而使系统调用新的窗口过程而不是之前的窗口过程。应用程序必须通过调用 CallWindowProc 函数向之前窗口过程传递新窗口未处理的消息,这使得应用程序可以创建一个窗口过程链。
5. 通过在调用 RegisterClassEx 函数中将 WNDCLASSEX 结构中的 cbWndExtra 成员指定为非 0 值来保留窗口额外存储空间。
6. 你不能通过调用带有 GWL_HWNDPARENT 索引的 SetWindowLong 函数来改变子窗口的父窗口,应该使用 SetParent函数。
7. 如果窗口具有 CS_CLASSDC 或 CS_OWNDC 窗口风格,不要设置扩展窗口风格为 WS_EX_COMPOSITED 或 WS_EX_LAYERED。
8. 调用 SetWindowLong 函数来设置进度条的风格将重置它的位置。
需求:
|
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 |
SetWindowLongW (Unicode) 和 SetWindowLongA (ANSI) |




