SetWindowLongA 函数 (winuser.h)

更改指定窗口的属性。 该函数还将指定偏移量处的 32 位(long)值设置为额外的窗口内存。

注意 此函数已被 setWindowLongPtr 函数 取代。 若要编写与 32 位和 64 位版本的 Windows 兼容的代码,请使用 SetWindowLongPtr 函数。
 

语法

LONG SetWindowLongA(
  [in] HWND hWnd,
  [in] int  nIndex,
  [in] LONG dwNewLong
);

参数

[in] hWnd

类型:HWND

窗口的句柄,间接地是窗口所属的类。

[in] nIndex

类型:int

要设置的值的从零开始的偏移量。 有效值介于零到额外窗口内存的字节数之间,减去整数的大小。 若要设置任何其他值,请指定以下值之一。

价值 意义
GWL_EXSTYLE
-20
设置新的 扩展窗口样式。
GWL_HINSTANCE
-6
设置新的应用程序实例句柄。
GWL_ID
-12
设置子窗口的新标识符。 窗口不能是顶级窗口。
GWL_STYLE
-16
设置新的 窗口样式
GWL_USERDATA
-21
设置与窗口关联的用户数据。 此数据供创建窗口的应用程序使用。 其值最初为零。
GWL_WNDPROC
-4
设置窗口过程的新地址。

如果窗口不属于与调用线程相同的进程,则无法更改此属性。

 

hWnd 参数标识对话框时,也可以使用以下值。

价值 意义
DWL_DLGPROC
DWLP_MSGRESULT + sizeof(LRESULT)
设置对话框过程的新地址。
DWL_MSGRESULT
0
设置在对话框过程中处理的消息的返回值。
DWL_USER
DWLP_DLGPROC + sizeof(DLGPROC)
设置应用程序专用的新额外信息,例如句柄或指针。

[in] dwNewLong

类型:LONG

替换值。

返回值

类型:LONG

如果函数成功,则返回值为指定的 32 位整数的上一个值。

如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError

如果指定的 32 位整数的上一个值为零,并且函数成功,则返回值为零,但该函数未清除最后的错误信息。 这使得难以确定成功或失败。 若要解决此问题,应先调用 SetLastError 0,然后再调用 setWindowLong,以清除最后一个错误信息。 然后,函数失败将由返回值零和 GetLastError 非零的结果指示。

言论

缓存某些窗口数据,因此使用 setWindowLong 所做的更改在调用 SetWindowPos 函数后才会生效。 具体而言,如果更改任何框架样式,则必须使用 SWP_FRAMECHANGED 标志调用 SetWindowPos,以便正确更新缓存。

如果使用 SetWindowLongGWL_WNDPROC 索引替换窗口过程,则窗口过程必须符合 WindowProc 回调函数的说明中指定的准则。

如果将 SetWindowLongDWL_MSGRESULT 索引一起使用来设置对话过程处理的消息的返回值,则应在之后直接返回 true。 否则,如果调用任何导致对话框过程接收窗口消息的函数,则嵌套窗口消息可能会覆盖使用 DWL_MSGRESULT设置的返回值。

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

通过在 RegisterClassEx 函数一起使用的 WNDCLASSEX 结构 成员中指定非零值来保留额外的窗口内存。

不得使用 GWL_HWNDPARENT 索引调用 SetWindowLong 以更改子窗口的父窗口。 请改用 SetParent 函数。

如果窗口的类样式为 CS_CLASSDCCS_OWNDC,请不要 WS_EX_COMPOSITEDWS_EX_LAYERED设置扩展窗口样式。

调用 SetWindowLong 设置进度栏上的样式将重置其位置。

例子

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

注意

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

要求

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

另请参阅

CallWindowProc

概念

GetWindowLong

参考

RegisterClassEx

SetParent

SetWindowLongPtr

WNDCLASSEX

窗口类

WindowProc