WM_POINTERUP, message

Publié lorsqu’un pointeur qui a fait contact sur la zone cliente d’un contact de fenêtre interrompt le contact. Le message cible la fenêtre sur laquelle le pointeur effectue le contact et le pointeur est, à ce stade, capturé implicitement vers la fenêtre afin que la fenêtre continue de recevoir les 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 à travers sa fonction WindowProc.

![Important]
Les applications de bureau doivent prendre en charge les points par pouce (ppp). Si votre application ne prend pas en charge les 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 ppp. La virtualisation ppp fournit une prise en charge de la mise à l’échelle automatique pour les applications qui ne prennent pas en charge les ppp et est active par défaut (les utilisateurs peuvent la désactiver). Pour plus d’informations, consultez Écriture d’applications Win32 haute résolution.

#define WM_POINTERUP                  0x0247

Paramètres

wParam

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

  • GET_POINTERID_WPARAM(wParam) : l’identificateur du pointeur.

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

  • IS_POINTER_INRANGE_WPARAM(wParam) : 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) : indique si ce message a été généré par un pointeur qui est en contact avec la surface de la fenêtre. Cet indicateur n’est pas défini sur les messages qui indiquent un pointeur qui survole.

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

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

    • Ceci est comparable à un bouton gauche de la souris enfoncé.
    • Un pointeur tactile aura cet indicateur défini lorsqu’il est en contact avec la surface du numériseur.
    • Un pointeur de stylet aura cet indicateur défini lorsqu’il est en contact avec la surface du numériseur sans aucun bouton enfoncé.
  • IS_POINTER_SECONDBUTTON_WPARAM(wParam) : indique s’il existe une action secondaire.

    • Ceci est comparable à un bouton droit de la souris enfoncé.
    • Un pointeur de stylet aura cet indicateur défini lorsqu’il est en contact avec la surface du numériseur avec le bouton du stylet enfoncé.
  • IS_POINTER_THIRDBUTTON_WPARAM(wParam) : 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 l’état des boutons d’un stylet en appelant GetPointerPenInfo et en examinant les indicateurs qui spécifient l’état du bouton spécifié.

  • IS_POINTER_FOURTHBUTTON_WPARAM(wParam) : indique si le pointeur spécifié a effectué la quatrième action. Les applications qui souhaitent répondre aux quatrièmes 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) : indique si le pointeur spécifié a effectué la cinquième action. Les applications qui souhaitent répondre aux cinquièmes 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, voir Indicateurs de pointeur.

    Notes

    Un pointeur qui survole n’a aucun indicateur de bouton défini. Ceci est semblable à un déplacement de la souris sans bouton de souris enfoncé. Par exemple, une application peut déterminer l’état des boutons d’un stylet qui survole en appelant GetPointerPenInfo et en examinant les indicateurs qui spécifient l’état du bouton spécifié.

lParam

Contient l’emplacement de point du pointeur.

Notes

É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 retournée

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

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

Notes

![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 faire d’hypothèses basées sur des notifications WM_POINTERDOWN/WM_POINTERUP ou WM_POINTERENTER/WM_POINTERLEAVE uniformément associées.

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 qui survole est détecté. Un message WM_POINTERDOWN suivi d’un message WM_POINTERENTER est généré si un pointeur qui ne survole pas 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 survole 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.

Utilisez le code suivant pour obtenir la position horizontale et verticale d’un pointeur :

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

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

Vous pouvez également utiliser la macro MAKEPOINTS pour convertir le paramètre lParam en structure POINTS.

La fonction GetKeyState peut être utilisée pour déterminer les états de la touche 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_GESTURE si la séquence d’entrée à partir de ce pointeur, et éventuellement d’autres pointeurs, est reconnue comme un mouvement. Si un mouvement n’est pas reconnu, DefWindowProc peut générer une entrée de souris.

Si une application consomme de manière sélective une entrée de pointeur et transfère le reste à DefWindowProc, le comportement résultant n’est pas défini.

Utilisez la fonction GetPointerInfo pour récupérer d’autres informations associées au message.

Exemples

L’exemple de code suivant montre comment récupérer les positions 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;
}

Spécifications

Condition requise Valeur
Client minimal pris en charge
Windows 8 [applications de bureau uniquement]
Serveur minimal pris en charge
Windows Server 2012 [applications de bureau uniquement]
En-tête
Winuser.h (y compris Windows.h)

Voir aussi

Messages

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