SetWindowLong函数更改指定窗口的属性。该函数还将指定偏移量的32位(长)值设置为窗口的额外窗口存储器。
LONG SetWindowLong
HWND 【的hWnd】, | //窗口的句柄 |
INT 【参数nIndex】, | //要设置的值的偏移量 |
LONG 【dwNewLong】 | //新值 |
); |
参数
【的hWnd】
标识窗口,间接地标识窗口所属的类。
【参数nIndex】
指定要设置的值的基于零的偏移量。有效值的范围为零,通过额外的窗口内存的字节数减去4;例如,如果指定了12个或更多字节的额外内存,则值为8将成为第三个32位整数的索引。要设置任何其他值,请指定以下值之一:
值 | 行动 |
GWL_EXSTYLE | 设置一个新的扩展窗口样式。 |
GWL_STYLE | 设置一个新的窗口样式。 |
GWL_WNDPROC | 设置窗口过程的新地址。 |
GWL_HINSTANCE | 设置一个新的应用程序实例句柄。 |
GWL_ID | 设置窗口的新标识符。 |
GWL_USERDATA | 设置与窗口相关联的32位值。每个窗口都有一个相应的32位值,用于创建窗口的应用程序使用。 |
当【的hWnd】参数标识一个对话框时,以下值也可用:
值 | 行动 |
DWL_DLGPROC | 设置对话框过程的新地址。 |
DWL_MSGRESULT | 设置对话框过程中处理的消息的返回值。 |
DWL_USER | 设置对应用程序是私有的新的额外信息,如句柄或指针。 |
【dwNewLong】
指定替换值。
返回值
如果函数成功,则返回值是指定的32位整数的前一个值。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
如果指定的32位整数的前一个值为零,并且该函数成功,则返回值为零,但该函数不会清除最后一个错误信息。这使得很难确定成功或失败。要解决这个问题,您应该在致电SetWindowLong之前致电SetLastError(0)清除最后一个错误信息。然后,函数失败将由零的返回值和非零值的GetLastError结果指示。
备注
如果【的hWnd】参数指定的窗口不属于与调用线程相同的进程,则SetWindowLong功能将失败。
如果使用SetWindowLong功能和GWL_WNDPROC索引替换窗口过程,则窗口过程必须符合WindowProc回调函数说明中指定的准则。
使用GWL_WNDPROC索引调用SetWindowLong将创建用于创建窗口的窗口类的子类。应用程序不应该对由其他进程创建的窗口进行子类化。SetWindowLong函数通过更改与特定窗口关联的窗口过程来创建窗口子类,导致Windows调用新窗口过程而不是前一个窗口过程。应用程序必须通过调用CallWindowProc将新窗口过程未处理的任何消息传递到上一个窗口过程。这允许应用程序创建一个窗口过程链。
通过在与RegisterClass功能一起使用的WNDCLASS结构的cbWndExtra成员中指定非零值来预留额外的窗口内存。
您不得使用GWL_HWNDPARENT索引调用SetWindowLong来更改子窗口的父级。而是使用SetParent功能。
也可以看看
CallWindowProc, GetWindowLong, GetWindowWord, RegisterClass, SetParent, SetWindowWord, WindowProc, WNDCLASS