Сообщение WM_POINTERUP

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

Окно получает это сообщение через функцию WindowProc .

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

#define WM_POINTERUP                  0x0247

Параметры

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_POINTERCAPTURECHANGED , обычно оно не получит никаких дополнительных уведомлений. По этой причине важно не делать никаких предположений на основе равномерно парных WM_POINTERDOWN WM_POINTERUP/ или/ WM_POINTERENTER уведомлений WM_POINTERLEAVE.

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

При обнаружении указателя на указатель на указатель на 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 для получения дополнительных сведений, связанных с этим сообщением.

Примеры

В следующем примере кода показано, как получить положение x и y указателя, связанного с этим сообщением.

int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);

// process pointer up, similar to mouse button up

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

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_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 = HandleGenericPointerMessage(&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