Compartir a través de


Mensaje WM_POINTERUP

Publicado cuando un puntero que hizo contacto sobre el área cliente de una ventana interrumpe el contacto. Este mensaje de entrada tiene como destino la ventana en la que el puntero realiza contacto y el puntero es, en ese momento, capturado implícitamente en la ventana para que la ventana continúe recibiendo mensajes de entrada del puntero hasta que interrumpa el contacto, incluida la notificación de WM_POINTERUP.

Una ventana recibe este mensaje mediante la función WindowProc.

Importante
Las aplicaciones de escritorio deben tener en cuenta ppp. Si la aplicación no es compatible con ppp, las coordenadas de pantalla contenidas en los mensajes de puntero y las estructuras relacionadas pueden parecer inexactas debido a la virtualización de ppp. La virtualización de ppp proporciona compatibilidad de escalado automático con aplicaciones que no son compatibles con ppp y que están activas de manera predeterminada (los usuarios pueden desactivarla). Para obtener más información, consulte Escritura de aplicaciones Win32 con valores altos de ppp.

#define WM_POINTERUP                  0x0247

Parámetros

wParam

Contiene información sobre el puntero. Use las siguientes macros para recuperar la información del parámetro wParam:

  • GET_POINTERID_WPARAM(wParam): identificador de puntero.

  • IS_POINTER_NEW_WPARAM(wParam): una marca que indica si este mensaje representa la primera entrada generada por un nuevo puntero.

  • IS_POINTER_INRANGE_WPARAM(wParam): una marca que indica si un puntero generó este mensaje durante su vigencia. Esta marca no está establecida en los mensajes que indican que el puntero tiene un intervalo de detección izquierdo.

  • IS_POINTER_INCONTACT_WPARAM(wParam): una marca que indica si un puntero que está en contacto con la superficie de la ventana generó este mensaje. Esta marca no está establecida en los mensajes que indican un puntero de desplazamiento.

  • IS_POINTER_PRIMARY_WPARAM(wParam): indica que este puntero se ha designado como principal.

  • IS_POINTER_FIRSTBUTTON_WPARAM(wParam): una marca que indica si hay una acción principal.

    • Esto es análogo a un botón izquierdo del mouse hacia abajo.
    • Un puntero táctil tendrá esto establecido cuando esté en contacto con la superficie del digitalizador.
    • Un puntero de pluma tendrá esto establecido cuando esté en contacto con la superficie del digitalizador sin presionar ningún botón.
  • IS_POINTER_SECONDBUTTON_WPARAM(wParam): una marca que indica si hay una acción secundaria.

    • Esto es análogo a un botón derecho del mouse hacia abajo.
    • Un puntero de pluma tendrá esto establecido cuando esté en contacto con la superficie del digitalizador con el botón de menú contextual de lápiz presionado.
  • IS_POINTER_THIRDBUTTON_WPARAM(wParam): una marca que indica si hay una o varias acciones terciarias basadas en el tipo de puntero; las aplicaciones que desean responder a acciones terciarias deben recuperar información específica del tipo de puntero para determinar qué botones terciarios se presionan. Por ejemplo, una aplicación puede determinar los estados de botones de un lápiz llamando a GetPointerPenInfo y examinando las marcas que especifican estados de botón.

  • IS_POINTER_FOURTHBUTTON_WPARAM(wParam): una marca que indica si el puntero especificado realizó la cuarta acción. Las aplicaciones que quieran responder a cuartas acciones deben recuperar información específica del tipo de puntero para determinar si se presiona el primer botón extendido del mouse (XButton1).

  • IS_POINTER_FIFTHBUTTON_WPARAM(wParam): una marca que indica si el puntero especificado realizó la quinta acción. Las aplicaciones que desean responder a quintas acciones deben recuperar información específica del tipo de puntero para determinar si se presiona el segundo botón extendido del mouse (XButton2).

    Consulte Marcas de puntero para obtener más detalles.

    Nota:

    Un puntero que mantiene el mouse no tiene ninguna de las marcas de botón establecidas. Esto es análogo a un movimiento del mouse sin botones del mouse hacia abajo. Una aplicación puede determinar los estados de botones de un lápiz de desplazamiento, por ejemplo, llamando a GetPointerPenInfo y examinando las marcas que especifican estados de botón.

lParam

Contiene la ubicación de punto del puntero.

Nota:

Dado que el puntero puede establecer contacto con el dispositivo sobre un área no trivial, esta ubicación de punto puede ser una simplificación de un área de puntero más compleja. Siempre que sea posible, una aplicación debe usar la información completa del área de puntero en lugar de la ubicación del punto.

Use las macros siguientes para recuperar las coordenadas de pantalla físicas del punto.

Valor devuelto

Si la aplicación procesa este mensaje, debe devolver cero.

Si la aplicación no procesa este mensaje, debe llamar a DefWindowProc.

Comentarios

Importante
Cuando una ventana pierde la captura de un puntero y recibe la notificación de WM_POINTERCAPTURECHANGED, normalmente no recibirá ninguna notificación adicional. Por este motivo, es importante que no realice ninguna suposición basada en las notificaciones emparejadas uniformemente WM_POINTERDOWN/WM_POINTERUP o WM_POINTERENTER/WM_POINTERLEAVE.

Cada puntero tiene un identificador de puntero único durante su vigencia. La duración de un puntero comienza cuando se detecta por primera vez.

Se genera un mensaje WM_POINTERENTER si se detecta un puntero de desplazamiento. Se genera un mensaje WM_POINTERDOWN seguido de un mensaje WM_POINTERENTER si se detecta un puntero de no desplazamiento.

Durante su vigencia, un puntero puede generar una serie de mensajes WM_POINTERUPDATE mientras mantiene el puntero o está en contacto.

La duración de un puntero finaliza cuando ya no se detecta. Esto genera un mensaje WM_POINTERLEAVE.

Cuando se anula un puntero, se establece POINTER_FLAG_CANCELED.

También se puede generar un mensaje WM_POINTERLEAVE cuando un puntero no capturado se mueve fuera de los límites de una ventana.

Use lo siguiente para obtener la posición horizontal y vertical de un puntero:

Use el código siguiente para obtener la posición horizontal y vertical:

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

También puede usar la macro MAKEPOINTS para convertir el parámetro lParam en una estructura POINTS.

La función GetKeyState se puede usar para determinar los estados de teclas modificadoras de teclado asociados a este mensaje. Por ejemplo, para detectar que se ha pulsado la tecla ALT, compruebe si GetKeyState(VK_MENU) < 0.

Si la aplicación no procesa este mensaje, DefWindowProc puede generar uno o varios mensajes WM_GESTURE si la secuencia de entrada de este y, posiblemente, otros punteros se reconocen como un gesto. Si no se reconoce un gesto, DefWindowProc puede generar la entrada del mouse.

Si una aplicación consume de forma selectiva alguna entrada de puntero y pasa el resto a DefWindowProc, el comportamiento resultante no está definido.

Use la función GetPointerInfo para recuperar más información relacionada con este mensaje.

Ejemplos

En el ejemplo de código siguiente se muestra cómo recuperar la posición x e y del puntero asociado a este mensaje.

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

// process pointer up, similar to mouse button up

En el ejemplo de código siguiente se muestra cómo obtener el identificador de puntero asociado a este mensaje.

POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);

// Retrieve common pointer information
if (!GetPointerInfo(pointerId, &pointerInfo))
{
    
// failure, call GetLastError()
}
else
{
    // success, process pointerInfo
}


En el ejemplo de código siguiente se muestra cómo controlar diferentes tipos de puntero asociados a este mensaje.

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

Requisitos

Requisito Valor
Cliente mínimo compatible
Windows 8 [solo aplicaciones de escritorio]
Servidor mínimo compatible
Windows Server 2012 [solo aplicaciones de escritorio]
Encabezado
Winuser.h (incluya Windows.h)

Consulte también

Mensajes

Referencia

Marcas de puntero

GET_POINTERID_WPARAM

IS_POINTER_NEW_WPARAM

IS_POINTER_INRANGE_WPARAM

IS_POINTER_INCONTACT_WPARAM

IS_POINTER_PRIMARY_WPARAM

IS_POINTER_FIRSTBUTTON_WPARAM

IS_POINTER_SECONDBUTTON_WPARAM

IS_POINTER_THIRDBUTTON_WPARAM

IS_POINTER_FOURTHBUTTON_WPARAM

IS_POINTER_FIFTHBUTTON_WPARAM