Сообщение WM_POINTERUPDATE

Опубликовано, чтобы предоставить обновление указателя, который связался с клиентской областью окна или на наведении указателя на клиентская область окна. Пока указатель наведен на указатель, сообщение предназначено для любого окна, на котором происходит переключение указателя. Хотя указатель находится в контакте с поверхностью, указатель неявно фиксируется в окне, по которому указатель сделал контакт, и это окно продолжает получать входные данные для указателя, пока он не прерывает контакт.

Важно!
Классические приложения должны быть осведомлены о DPI. Если приложение не учитывает DPI, координаты экрана, содержащиеся в сообщениях указателя и связанных структурах, могут отображаться неточными из-за виртуализации DPI. Виртуализация DPI обеспечивает автоматическую поддержку масштабирования приложений, которые не поддерживают DPI и активны по умолчанию (пользователи могут отключить его). Дополнительные сведения см. в статье "Написание приложений Win32 с высоким уровнем DPI".

#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_FIRS ТБ UTTON_WPARAM(wParam): флаг, указывающий, существует ли основное действие.

    • Это аналогично левой кнопке мыши вниз.
    • Сенсорный указатель будет иметь этот набор, когда он находится в контакте с поверхностью дигитайзера.
    • Указатель пера будет иметь этот набор, если он находится в контакте с поверхностью дигитайзера без нажатия кнопок.
  • IS_POINTER_SECONDBUTTON_WPARAM(wParam): флаг, указывающий, существует ли дополнительное действие.

    • Это аналогично кнопке мыши вправо.
    • Указатель пера будет иметь этот набор, когда он находится в контакте с поверхностью дигитайзера с кнопкой пера зажатой кнопкой.
  • IS_POINTER_THIRDBUTTON_WPARAM(wParam): флаг, указывающий, есть ли одно или несколько tertiary действий на основе типа указателя; приложения, которые хотят реагировать на третичные действия, должны получать сведения, относящиеся к типу указателя, чтобы определить, какие третичные кнопки нажимаются. Например, приложение может определить состояния кнопок пера, вызвав 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_FIRS ТБ UTTON_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, &amp;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 [только классические приложения]
Верхний колонтитул
Winuser.h (включая Windows.h)

См. также

Сообщения

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

Флаги указателя

GET_POINTERID_WPARAM

IS_POINTER_NEW_WPARAM

IS_POINTER_INRANGE_WPARAM

IS_POINTER_INCONTACT_WPARAM

IS_POINTER_PRIMARY_WPARAM

IS_POINTER_FIRS ТБ UTTON_WPARAM

IS_POINTER_SECONDBUTTON_WPARAM

IS_POINTER_THIRDBUTTON_WPARAM

IS_POINTER_FOURTHBUTTON_WPARAM

IS_POINTER_FIFTHBUTTON_WPARAM