SetWindowLongPtrA 函数 (winuser.h)

更改指定窗口的属性。 该函数还会在额外窗口内存中的指定偏移量处设置值。

注意 若要编写与 32 位和 64 位版本的 Windows 兼容的代码,请使用 SetWindowLongPtr。 为 32 位 Windows 编译时, SetWindowLongPtr 定义为对 SetWindowLong 函数的调用。

 

语法

LONG_PTR SetWindowLongPtrA(
  [in] HWND     hWnd,
  [in] int      nIndex,
  [in] LONG_PTR dwNewLong
);

参数

[in] hWnd

类型:HWND

窗口的句柄,以及窗口所属的类的间接句柄。 如果拥有由 hWnd 参数指定的窗口的进程在 UIPI 层次结构中的进程特权高于调用线程所在的进程,则 SetWindowLongPtr 函数将失败。

Windows XP/2000: 如果 hWnd 参数指定的窗口与调用线程不属于同一进程,SetWindowLongPtr 函数将失败。

[in] nIndex

类型: int

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

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

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

含义
DWLP_DLGPROC
DWLP_MSGRESULT + sizeof (LRESULT)
设置指向对话框过程的新指针。
DWLP_MSGRESULT
0
设置对话框过程中处理的消息的返回值。
DWLP_USER
DWLP_DLGPROC + sizeof (DLGPROC)
设置应用程序专用的新额外信息,例如句柄或指针。

[in] dwNewLong

类型: LONG_PTR

替换值。

返回值

类型: LONG_PTR

如果函数成功,则返回值为指定偏移量的上一个值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

如果上一个值为零且函数成功,则返回值为零,但该函数不会清除最后一个错误信息。 若要确定成功或失败,请通过调用 0 的 SetLastError 清除最后一个错误信息,然后调用 SetWindowLongPtr。 函数失败将由返回值零和 GetLastError 结果指示为非零。

备注

某些窗口数据会缓存,因此使用 SetWindowLongPtr 所做的更改在调用 SetWindowPos 函数之前不会生效。

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

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

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

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

请勿使用GWLP_HWNDPARENT索引调用 SetWindowLongPtr 来更改子窗口的父窗口。 请改用 SetParent 函数。

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

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

注意

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

要求

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

另请参阅

CallWindowProc

概念性

GetWindowLongPtr

引用

RegisterClassEx

SetParent

WNDCLASSEX

窗口类

WindowProc