Поделиться через


Функция SetWindowLongPtrW (winuser.h)

Изменяет атрибут указанного окна. Функция также задает значение с указанным смещением в дополнительной памяти окна.

Примечание Чтобы написать код, совместимый с 32-разрядной и 64-разрядной версиями Windows, используйте SetWindowLongPtr. При компиляции для 32-разрядной версии Windows SetWindowLongPtr определяется как вызов функции SetWindowLong .

 

Синтаксис

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

Параметры

[in] hWnd

Тип: HWND

Дескриптор для окна и, косвенно, класса, к которому принадлежит окно. Функция SetWindowLongPtr завершается сбоем, если процесс, которому принадлежит окно, заданное параметром hWnd , находится на более высоких правах процесса в иерархии UIPI, чем процесс, в котором находится вызывающий поток.

Windows XP/2000: Функция SetWindowLongPtr завершается сбоем , если окно, указанное параметром hWnd , не принадлежит тому же процессу, что и вызывающий поток.

[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.

Если предыдущее значение равно нулю и функция завершается успешно, возвращаемое значение равно нулю, но функция не очищает сведения о последней ошибке. Чтобы определить успешное или неудачное завершение, очистите последние сведения об ошибке, вызвав Метод SetLastError с 0, а затем вызовите Метод SetWindowLongPtr. Сбой функции будет отмечен возвращаемым значением, равным нулю, и результатом GetLastError , который не равен нулю.

Комментарии

Некоторые данные окна кэшируются, поэтому изменения, внесенные с помощью SetWindowLongPtr, не вступают в силу, пока вы не вызовете функцию SetWindowPos .

Если вы используете SetWindowLongPtr с индексом GWLP_WNDPROC для замены процедуры окна, процедура окна должна соответствовать рекомендациям, указанным в описании функции обратного вызова WindowProc .

Если вы используете SetWindowLongPtr с индексом DWLP_MSGRESULT , чтобы задать возвращаемое значение для сообщения, обработанного процедурой диалогового окна, процедура диалогового окна должна возвращать значение TRUE непосредственно после этого. В противном случае при вызове любой функции, которая приводит к тому, что процедура диалогового окна получает сообщение о окне, вложенное сообщение окна может перезаписать возвращаемое значение, заданное с помощью DWLP_MSGRESULT.

Вызов Метода SetWindowLongPtr с индексом GWLP_WNDPROC создает подкласс класса окна, используемого для создания окна. Приложение может подкласс системного класса, но не должно подкласса класса окна, созданного другим процессом. Функция SetWindowLongPtr создает подкласс окна, изменяя процедуру окна, связанную с определенным классом окна, в результате чего система вызывает новую процедуру окна вместо предыдущей. Приложение должно передавать все сообщения, не обработанные новой процедурой окна, в предыдущую процедуру, вызывая CallWindowProc. Это позволяет приложению создать цепочку оконных процедур.

Зарезервируйте дополнительную память окна, указав ненулевое значение в элементе cbWndExtra структуры WNDCLASSEX, используемой с функцией RegisterClassEx .

Не вызывайте SetWindowLongPtr с индексом GWLP_HWNDPARENT , чтобы изменить родительский элемент дочернего окна. Вместо этого используйте функцию SetParent .

Если окно имеет стиль класса CS_CLASSDC или CS_PARENTDC, не устанавливайте стили расширенных окон WS_EX_COMPOSITED или WS_EX_LAYERED.

Вызов Метода SetWindowLongPtr для задания стиля на индикаторе выполнения приведет к сбросу его положения.

Примечание

Заголовок winuser.h определяет SetWindowLongPtr в качестве псевдонима, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОД. Использование псевдонима, не зависящий от кодирования, с кодом, который не является нейтральным для кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или времени выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header winuser.h (включая Windows.h)
Библиотека User32.lib
DLL User32.dll
Набор API ext-ms-win-ntuser-windowclass-l1-1-0 (представлено в Windows 8)

См. также раздел

CallWindowProc

Основные понятия

GetWindowLongPtr

Справочные материалы

RegisterClassEx

Setparent

WNDCLASSEX

Классы окон

Windowproc