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


Сообщение WM_POINTERDOWN

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

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

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

#define WM_POINTERDOWN                   0x0246

Параметры

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);

Чтобы преобразовать параметр lParam в структуру POINTS), используйте макрос MAKEPOINTS.

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

Чтобы определить состояния клавиши-модификатора, связанные с этим сообщением, используйте функцию GetKeyState . Например, чтобы определить, что клавиша ALT была нажата, проверка ли GetKeyState(VK_MENU) < 0.

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

Если приложение выборочно использует некоторые входные данные указателя и передает остальные данные в DefWindowProc, то результирующее поведение не определено.

Когда окно теряет запись указателя и получает уведомление WM_POINTERCAPTURECHANGED , оно обычно не получит никаких дополнительных уведомлений. Поэтому важно, чтобы окно не предполагает никаких предположений о состоянии указателя, независимо от того, получает ли он равномерно парные уведомления DOWN / UP или ВВОД / ОСТАВИТЬ.

Примеры

В следующем примере кода показано, как использовать IS_POINTER_FIRS ТБ UTTON_WPARAM, GET_X_LPARAM, GET_Y_LPARAM и IS_POINTER_SECONDBUTTON_WPARAMдля получения соответствующих сведений, связанных с сообщением WM_POINTERDOWN.

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

if (IS_POINTER_PRIMARYBUTTON_WPARAM(wParam))
{
    // process pointer down, similar to mouse left button down
}
else if (IS_POINTER_SECONDARYBUTTON_WPARAM(wParam))
{
    // process pointer down, similar to mouse right button down
}

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

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