Partager via


message WM_POINTERUP

Publié lorsqu’un pointeur qui a effectué un contact sur la zone cliente d’un contact de fenêtre interrompt le contact. Ce message d’entrée cible la fenêtre sur laquelle le pointeur effectue le contact et le pointeur est, à ce stade, capturé implicitement dans la fenêtre afin que la fenêtre continue de recevoir des messages d’entrée, y compris la notification WM_POINTERUP pour le pointeur jusqu’à ce qu’il interrompe le contact.

Une fenêtre reçoit ce message via sa fonction WindowProc.

! [Important]
Les applications de bureau doivent être conscientes des ppp. Si votre application n’est pas prise en charge par ppp, les coordonnées d’écran contenues dans les messages de pointeur et les structures associées peuvent sembler inexactes en raison de la virtualisation DPI. La virtualisation DPI fournit une prise en charge automatique de la mise à l’échelle pour les applications qui ne sont pas conscientes des ppp et qui sont actives par défaut (les utilisateurs peuvent le désactiver). Pour plus d’informations, consultez Écriture d’applications High-DPI Win32.

#define WM_POINTERUP                  0x0247

Paramètres

wParam

Contient des informations sur le pointeur. Utilisez les macros suivantes pour récupérer des informations à partir du paramètre wParam.

  • GET_POINTERID_WPARAM(wParam) : identificateur du pointeur.

  • IS_POINTER_NEW_WPARAM(wParam) : indicateur qui indique si ce message représente la première entrée générée par un nouveau pointeur.

  • IS_POINTER_INRANGE_WPARAM(wParam) : indicateur qui indique si ce message a été généré par un pointeur pendant sa durée de vie. Cet indicateur n’est pas défini sur les messages qui indiquent que le pointeur a quitté la plage de détection

  • IS_POINTER_INCONTACT_WPARAM(wParam) : indicateur qui indique si ce message a été généré par un pointeur qui est en contact avec l’aire de fenêtre. Cet indicateur n’est pas défini sur les messages qui indiquent un pointeur de pointeur pointeur.

  • IS_POINTER_PRIMARY_WPARAM(wParam) : indique que ce pointeur a été désigné comme principal.

  • IS_POINTER_FIRSTBUTTON_WPARAM(wParam) : indicateur qui indique s’il existe une action principale.

    • Cela est analogue à un bouton gauche de la souris vers le bas.
    • Un pointeur tactile aura cet ensemble lorsqu’il est en contact avec la surface du numériseur.
    • Un pointeur de stylet aura ce jeu lorsqu’il est en contact avec la surface du numériseur sans boutons enfoncés.
  • IS_POINTER_SECONDBUTTON_WPARAM(wParam) : indicateur qui indique s’il existe une action secondaire.

    • Cela est analogue à un bouton droit de la souris vers le bas.
    • Un pointeur de stylet aura ce jeu lorsqu’il est en contact avec la surface du numériseur avec le bouton de canon de stylet enfoncé.
  • IS_POINTER_THIRDBUTTON_WPARAM(wParam) : indicateur qui indique s’il existe une ou plusieurs actions tertiaires basées sur le type de pointeur ; les applications qui souhaitent répondre aux actions tertiaires doivent récupérer des informations spécifiques au type de pointeur pour déterminer quels boutons tertiaires sont enfoncés. Par exemple, une application peut déterminer les états des boutons d’un stylet en appelant GetPointerPenInfo et en examinant les indicateurs qui spécifient des états de bouton.

  • IS_POINTER_FOURTHBUTTON_WPARAM(wParam) : indicateur qui indique si le pointeur spécifié a effectué la quatrième action. Les applications qui souhaitent répondre aux quatrième actions doivent récupérer des informations spécifiques au type de pointeur pour déterminer si le premier bouton de la souris étendue (XButton1) est enfoncé.

  • IS_POINTER_FIFTHBUTTON_WPARAM(wParam) : indicateur de qui indique si le pointeur spécifié a effectué la cinquième action. Les applications qui souhaitent répondre aux cinquième actions doivent récupérer des informations spécifiques au type de pointeur pour déterminer si le deuxième bouton de la souris étendue (XButton2) est enfoncé.

    Pour plus d’informations, consultez indicateurs de pointeur.

    Note

    Un pointeur de pointage n’a aucun indicateur de bouton défini. Cela est analogue à un déplacement de la souris sans boutons de souris vers le bas. Une application peut déterminer les états des boutons d’un stylet pointant, par exemple, en appelant GetPointerPenInfo et en examinant les indicateurs qui spécifient des états de bouton.

lParam

Contient l’emplacement du pointeur.

Note

Étant donné que le pointeur peut contacter l’appareil sur une zone non triviale, cet emplacement de point peut être une simplification d’une zone de pointeur plus complexe. Dans la mesure du possible, une application doit utiliser les informations complètes de zone de pointeur au lieu de l’emplacement du point.

Utilisez les macros suivantes pour récupérer les coordonnées d’écran physiques du point.

Valeur de retour

Si une application traite ce message, elle doit retourner zéro.

Si l’application ne traite pas ce message, elle doit appeler DefWindowProc.

Remarques

! [Important]
Lorsqu’une fenêtre perd la capture d’un pointeur et qu’elle reçoit la notification WM_POINTERCAPTURECHANGED, elle ne reçoit généralement aucune autre notification. Pour cette raison, il est important de ne pas effectuer d’hypothèses basées sur des notifications WM_POINTERDOWN/WM_POINTERUP ou WM_POINTERENTER/WM_POINTERLEAVE jumelées uniformément.

Chaque pointeur a un identificateur de pointeur unique pendant sa durée de vie. La durée de vie d’un pointeur commence lorsqu’il est détecté pour la première fois.

Un message WM_POINTERENTER est généré si un pointeur de pointage est détecté. Un message WM_POINTERDOWN suivi d’un message WM_POINTERENTER est généré si un pointeur non pointeur est détecté.

Pendant sa durée de vie, un pointeur peut générer une série de messages WM_POINTERUPDATE pendant qu’il pointe ou en contact.

La durée de vie d’un pointeur se termine lorsqu’il n’est plus détecté. Cela génère un message WM_POINTERLEAVE.

Lorsqu’un pointeur est abandonné, POINTER_FLAG_CANCELED est défini.

Un message WM_POINTERLEAVE peut également être généré lorsqu’un pointeur non capturé se déplace en dehors des limites d’une fenêtre.

Pour obtenir la position horizontale et verticale d’un pointeur, utilisez les éléments suivants :

Utilisez le code suivant pour obtenir la position horizontale et verticale :

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

La macro MAKEPOINTS peut également être utilisée pour convertir le paramètre lParam en structurePOINTS.

La fonction GetKeyState peut être utilisée pour déterminer les états de touches de modification du clavier associés à ce message. Par exemple, pour détecter que la touche ALT a été enfoncée, vérifiez si GetKeyState(VK_MENU) < 0.

Si l’application ne traite pas ce message, DefWindowProc peut générer un ou plusieurs messages WM_GESTUREsi la séquence d’entrée à partir de ce message et, éventuellement, d’autres pointeurs sont reconnus comme un mouvement. Si un mouvement n’est pas reconnu, DefWindowProc peut générer une entrée de souris.

Si une application consomme sélectivement une entrée de pointeur et passe le reste à DefWindowProc, le comportement résultant n’est pas défini.

Utilisez la fonction GetPointerInfo pour récupérer d’autres informations relatives à ce message.

Exemples

L’exemple de code suivant montre comment récupérer la position x et y du pointeur associé à ce message.

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

// process pointer up, similar to mouse button up

L’exemple de code suivant montre comment obtenir l’ID de pointeur associé à ce message.

POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);

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


L’exemple de code suivant montre comment gérer différents types de pointeurs associés à ce message.

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

Exigences

Exigence Valeur
Client minimum pris en charge
Windows 8 [applications de bureau uniquement]
Serveur minimum pris en charge
Windows Server 2012 [applications de bureau uniquement]
En-tête
Winuser.h (include Windows.h)

Voir aussi

Messages

de référence

indicateurs de pointeur

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