SetWindowLong
SetWindowLong函数更改指定窗口的属性。 该函数还将指定偏移量的32位(长)值设置到额外的窗口内存中。
注意 该函数已被SetWindowLongPtr函数取代。 要编写与32位和64位版本的Windows兼容的代码,请使用SetWindowLongPtr。
LONG SetWindowLong(
HWND hWnd, // 窗口句柄
int nIndex, // 要设置的值的偏移量
LONG dwNewLong // 新值
);
参数
返回值
如果函数成功,则返回值是指定的32位整数的前一个值。
如果函数失败,返回值为零。 要获得扩展的错误信息,请调用GetLastError。
如果指定的32位整数的前一个值为零,并且函数成功,则返回值为零,但该函数不会清除上次的错误信息。 这使得难以确定成功或失败。 要处理这个问题,你应该在调用SetWindowLong之前调用SetLastError(0)来清除最后的错误信息。 然后,函数失败将由返回值0和非零的GetLastError结果指示。
备注
某些窗口数据被缓存,所以使用SetWindowLong所做的更改只有在调用SetWindowPos函数后才会生效。 特别是,如果更改任何框架样式,则必须使用SWP_FRAMECHANGED标志调用SetWindowPos,才能正确更新缓存。
如果使用带有GWL_WNDPROC索引的SetWindowLong替换窗口过程,则窗口过程必须符合WindowProc回调函数描述中指定的准则。
如果使用SetWindowLong和DWL_MSGRESULT索引来设置由对话框过程处理的消息的返回值,则应在之后直接返回TRUE。 否则,如果调用导致对话过程接收窗口消息的任何函数,则嵌套窗口消息可能会覆盖使用DWL_MSGRESULT设置的返回值。
使用GWL_WNDPROC索引调用SetWindowLong将创建用于创建窗口的窗口类的子类。 应用程序可以继承一个系统类,但不应该继承由另一个进程创建的窗口类。 SetWindowLong函数通过更改与特定窗口类关联的窗口过程来创建窗口子类,导致系统调用新窗口过程而不是先前窗口过程。 应用程序必须通过调用CallWindowProc将任何未由新窗口过程处理的消息传递给上一个窗口过程。 这允许应用程序创建一系列窗口过程。
通过在RegisterClassEx函数使用的WNDCLASSEX结构的cbWndExtra成员中指定一个非零值来保留额外的窗口内存。
您不得使用GWL_HWNDPARENT索引调用SetWindowLong以更改子窗口的父级。 而是使用SetParent函数。
如果窗口的类样式为CS_CLASSDC或CS_OWNDC,则不要设置扩展窗口样式WS_EX_COMPOSITED或WS_EX_LAYERED。
Windows 95/98/Me: SetWindowLongW由Microsoft Layer for Unicode支持。 SetWindowLongA也支持在所有Windows操作系统中提供更一致的行为。 要使用这些版本,您必须将某些文件添加到您的应用程序中,如Windows 95/98 / Me系统上的Microsoft Layer for Unicode所述。
示例代码
有关示例,请参阅子类化窗口。
要求
Windows NT/2000/XP: 包含在Windows NT 3.1和更高版本中。
Windows 95/98/Me: 包含在Windows 95和更高版本中。
头文件: 声明于 Winuser.h; 包含于 Windows.h.
库: 使用 User32.lib.
Unicode: 在Windows NT/2000/XP上作为Unicode和ANSI版本实现。 Microsoft层还支持Unicode。