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


Функция 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

Дескриптор окна и, косвенно, класс, которому принадлежит окно. Функция 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, процедура окна должна соответствовать рекомендациям, указанным в описании функции обратного вызова WindowPro c.

Если вы используете 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 Профессиональный [только классические приложения]
минимальный поддерживаемый сервер Windows 2000 Server [только классические приложения]
целевая платформа Виндоус
заголовка 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