сообщение WM_POINTERUPDATE
Опубликовано, чтобы предоставить обновление указателя, который связался с клиентской областью окна или на наведении указателя на клиентская область окна. Пока указатель наведен на указатель, сообщение предназначено для любого окна, на котором происходит переключение указателя. Хотя указатель находится в контакте с поверхностью, указатель неявно фиксируется в окне, по которому указатель сделал контакт, и это окно продолжает получать входные данные для указателя, пока он не прерывает контакт.
! [Важно]
Классические приложения должны быть осведомлены о DPI. Если приложение не учитывает DPI, координаты экрана, содержащиеся в сообщениях указателя и связанных структурах, могут отображаться неточными из-за виртуализации DPI. Виртуализация DPI обеспечивает автоматическую поддержку масштабирования приложений, которые не поддерживают DPI и активны по умолчанию (пользователи могут отключить его). Дополнительные сведения см. в записи High-DPI приложений Win32.
#define WM_POINTERUPDATE 0x0245
Параметры
-
wParam
-
Содержит сведения о указателе. Используйте следующие макросы для получения сведений из параметра wParam.
GET_POINTERID_WPARAM(wParam): идентификатор указателя.
IS_POINTER_NEW_WPARAM(wParam): флаг, указывающий, представляет ли это сообщение первое входное значение, созданное новым указателем.
IS_POINTER_INRANGE_WPARAM(wParam): флаг, указывающий, было ли это сообщение создано указателем во время его существования. Этот флаг не задан в сообщениях, указывающих, что указатель оставил диапазон обнаружения
IS_POINTER_INCONTACT_WPARAM(wParam): флаг, указывающий, создается ли это сообщение указателем, который находится в контакте с поверхностью окна. Этот флаг не задан в сообщениях, указывающих указатель на наведении указателя мыши.
IS_POINTER_PRIMARY_WPARAM(wParam): указывает, что этот указатель был назначен в качестве первичного.
IS_POINTER_FIRSTBUTTON_WPARAM(wParam): флаг, указывающий, существует ли основное действие.
- Это аналогично левой кнопке мыши вниз.
- Сенсорный указатель будет иметь этот набор, когда он находится в контакте с поверхностью дигитайзера.
- Указатель пера будет иметь этот набор, если он находится в контакте с поверхностью дигитайзера без нажатия кнопок.
IS_POINTER_SECONDBUTTON_WPARAM(wParam): флаг, указывающий, существует ли дополнительное действие.
- Это аналогично кнопке мыши вправо.
- Указатель пера будет иметь этот набор, когда он находится в контакте с поверхностью дигитайзера с кнопкой пера зажатой кнопкой.
IS_POINTER_THIRDBUTTON_WPARAM(wParam): флаг, указывающий, существуют ли одно или несколько тертиарных действий на основе типа указателя; приложения, которые хотят реагировать на третичные действия, должны получать сведения, относящиеся к типу указателя, чтобы определить, какие третичные кнопки нажимаются. Например, приложение может определить состояния кнопок пера, вызвав GetPointerPenInfo и проверив флаги, указывающие состояния кнопки.
IS_POINTER_FOURTHBUTTON_WPARAM(wParam): флаг, указывающий, выполняется ли указанное действие указателя. Приложения, которые хотят реагировать на четвертые действия, должны получать сведения, относящиеся к типу указателя, чтобы определить, нажимается ли первая расширенная кнопка мыши (XButton1).
IS_POINTER_FIFTHBUTTON_WPARAM(wParam): флаг , указывающий, выполнил ли указанный указатель пятое действие. Приложения, которые хотят реагировать на пятые действия, должны получать сведения, относящиеся к типу указателя, чтобы определить, нажимается ли вторая расширенная кнопка мыши (XButton2).
Дополнительные сведения см.вфлагах указателя.
Заметка
Указатель на наведении указателя не имеет ни одного набора флагов кнопки. Это аналогично перемещению мыши без кнопок мыши. Приложение может определить состояния кнопок пера наведения указателя мыши, например путем вызова GetPointerPenInfo и изучения флагов, указывающих состояния кнопки.
-
lParam
-
Содержит расположение указателя.
Заметка
Так как указатель может связаться с устройством через нетривиальную область, это расположение точки может быть упрощением более сложной области указателя. По возможности приложение должно использовать полные сведения о области указателя вместо расположения точки.
Чтобы получить координаты физического экрана точки, используйте следующие макросы.
- GET_X_LPARAM(lParam): координата x (горизонтальная точка).
- GET_Y_LPARAM(lParam): координата y (вертикальная точка).
Возвращаемое значение
Если приложение обрабатывает это сообщение, оно должно возвращать ноль.
Если приложение не обрабатывает это сообщение, он должен вызывать DefWindowProc.
Замечания
Каждый указатель имеет уникальный идентификатор указателя во время его существования. Время существования указателя начинается при первом обнаружении.
При обнаружении указателя на указатель на указатель на WM_POINTERENTER создается WM_POINTERENTER. Сообщение WM_POINTERDOWN, за которым следует сообщение WM_POINTERENTER, создается, если обнаружен указатель, не наведенный на указатель.
В течение своего существования указатель может создавать ряд сообщений WM_POINTERUPDATE во время наведения указателя или контакта.
Время существования указателя заканчивается, когда он больше не обнаружен. Это создает сообщение WM_POINTERLEAVE.
При прерывании указателя POINTER_FLAG_CANCELED устанавливается.
Сообщение WM_POINTERLEAVE также может быть создано при перемещении указателя без записи за пределы окна.
Чтобы получить горизонтальное и вертикальное положение указателя, используйте следующее:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
Макрос MAKEPOINTS также можно использовать для преобразования параметра lParam в структуру POINTS.
ФункциюGetKeyStateможно использовать для определения состояний клавиши-модификатора клавиатуры, связанных с этим сообщением. Например, чтобы обнаружить, что клавиша ALT была нажата, проверьте, ли GetKeyState (VK_MENU) < 0.
Если приложение не обрабатывает это сообщение, DefWindowProc может создать одно или несколько сообщений WM_GESTURE, если последовательность входных данных из этого и, возможно, другие указатели распознаются как жест. Если жест не распознается, DefWindowProc может создавать входные данные мыши.
Если приложение выборочно использует некоторые входные данные указателя и передает остальные данные DefWindowProc, то результирующее поведение не определено.
Используйте функцию GetPointerInfo для получения дополнительных сведений, связанных с этим сообщением.
Если приложение не обрабатывает эти сообщения так быстро, как они создаются, некоторые перемещения могут быть объединены. Журнал входных данных, объединенных в это сообщение, можно получить с помощью функции GetPointerInfoHistory.
Примеры
В следующем примере кода показано, как использовать GET_X_LPARAM, GET_Y_LPARAM, IS_POINTER_FIRSTBUTTON_WPARAMи IS_POINTER_SECONDBUTTON_WPARAM для получения соответствующих сведений из параметров wParam и lParam сообщения WM_POINTERUPDATE.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
if (IS_POINTER_PRIMARYBUTTON_WPARAM(wParam))
{
// process pointer move while down, similar to mouse move with left button down
}
else if (IS_POINTER_SECONDARYBUTTON_WPARAM(wParam))
{
// process pointer move while down, similar to mouse move with right button down
}
В следующем примере кода показано, как использовать GET_POINTERID_WPARAM для получения идентификатора указателя из параметра wParam сообщения WM_POINTERUPDATE.
POINTER_INFO pointerInfo;
UINT32 pointerId = GET_POINTERID_WPARAM(wParam);
// Retrieve common pointer information
if (!GetPointerInfo(pointerId, &pointerInfo))
{
// failure, call GetLastError()
}
else
{
// success, process pointerInfo
}
В следующем примере кода показано, как обрабатывать различные типы указателей.
POINTER_TOUCH_INFO touchInfo;
POINTER_PEN_INFO penInfo;
POINTER_INFO pointerInfo;
UINT32 pointerId = GET_POINTERID_WPARAM(wParam);
POINTER_INPUT_TYPE pointerType = PT_POINTER;
// default to unhandled to enable call to DefWindowProc
fHandled = FALSE;
if (!GetPointerType(pointerId, &pointerType))
{
// failure, call GetLastError()
// set PT_POINTER to fall to default case below
pointerType = PT_POINTER;
}
switch (pointerType)
{
case PT_TOUCH:
// Retrieve touch information
if (!GetPointerTouchInfo(pointerId, &touchInfo))
{
// failure, call GetLastError()
}
else
{
// success, process touchInfo
// mark as handled to skip call to DefWindowProc
fHandled = TRUE;
}
break;
case PT_PEN:
// Retrieve pen information
if (!GetPointerPenInfo(pointerId, &penInfo))
{
// failure, call GetLastError()
}
else
{
// success, process penInfo
// mark as handled to skip call to DefWindowProc
fHandled = TRUE;
}
break;
default:
if (!GetPointerInfo(pointerId, &pointerInfo))
{
// failure.
}
else
{
// success, proceed with pointerInfo.
fHandled = HandleGenericPointerInfo(&pointerInfo);
}
break;
}
Требования
Требование | Ценность |
---|---|
Минимальный поддерживаемый клиент |
Windows 8 [только классические приложения] |
Минимальный поддерживаемый сервер |
Windows Server 2012 [только классические приложения] |
Заголовок |
|
См. также
-
Справочник