Share via


WM_POINTERUP messaggio

Inviato quando un puntatore che ha effettuato il contatto sull'area client di una finestra interrompe il contatto. Questo messaggio di input è destinato alla finestra su cui il puntatore effettua il contatto e il puntatore è, a quel punto, acquisito in modo implicito nella finestra in modo che la finestra continui a ricevere messaggi di input, inclusa la notifica WM_POINTERUP per il puntatore fino a quando non interrompe il contatto.

Una finestra riceve questo messaggio tramite la relativa funzione WindowProc.

! [Importante]
Le app desktop devono essere compatibili con dpi. Se l'app non riconosce valori DPI, le coordinate dello schermo contenute nei messaggi del puntatore e nelle strutture correlate potrebbero risultare imprecise a causa della virtualizzazione DPI. La virtualizzazione DPI offre supporto automatico per il ridimensionamento alle applicazioni che non sono compatibili con dpi ed è attivo per impostazione predefinita (gli utenti possono disattivarlo). Per altre informazioni, vedere Scrittura di applicazioni Win32 con valori DPI elevati.

#define WM_POINTERUP                  0x0247

Parametri

wParam

Contiene informazioni sul puntatore. Utilizzare le macro seguenti per recuperare informazioni dal parametro wParam.

  • GET_POINTERID_WPARAM(wParam): identificatore del puntatore.

  • IS_POINTER_NEW_WPARAM(wParam): flag che indica se questo messaggio rappresenta il primo input generato da un nuovo puntatore.

  • IS_POINTER_INRANGE_WPARAM(wParam): flag che indica se il messaggio è stato generato da un puntatore durante la sua durata. Questo flag non è impostato sui messaggi che indicano che il puntatore ha lasciato l'intervallo di rilevamento

  • IS_POINTER_INCONTACT_WPARAM(wParam): flag che indica se il messaggio è stato generato da un puntatore in contatto con la superficie della finestra. Questo flag non è impostato sui messaggi che indicano un puntatore al passaggio del mouse.

  • IS_POINTER_PRIMARY_WPARAM(wParam): indica che questo puntatore è stato designato come primario.

  • IS_POINTER_FIRSTBUTTON_WPARAM(wParam): flag che indica se è presente un'azione primaria.

    • Questo è analogo a un pulsante sinistro del mouse verso il basso.
    • Un puntatore tocco avrà questo set quando è in contatto con la superficie del digitalizzatore.
    • Un puntatore penna avrà questo set quando è in contatto con la superficie del digitalizzatore senza pulsanti premuti.
  • IS_POINTER_edizione Standard CONDBUTTON_WPARAM(wParam): flag che indica se è presente un'azione secondaria.

    • Questo è analogo a un pulsante destro del mouse verso il basso.
    • Un puntatore penna avrà questo set quando è in contatto con la superficie del digitalizzatore con il pulsante della canna della penna premuto.
  • IS_POINTER_THIRDBUTTON_WPARAM(wParam): flag che indica se sono presenti una o più azioni terziarie basate sul tipo di puntatore; le applicazioni che desiderano rispondere alle azioni terziarie devono recuperare informazioni specifiche del tipo di puntatore per determinare quali pulsanti terziari vengono premuti. Ad esempio, un'applicazione può determinare gli stati dei pulsanti di una penna chiamando GetPointerPenInfo ed esaminando i flag che specificano gli stati del pulsante.

  • IS_POINTER_FOURTHBUTTON_WPARAM(wParam): flag che indica se il puntatore specificato ha intrapreso la quarta azione. Le applicazioni che desiderano rispondere alle quarto azioni devono recuperare informazioni specifiche del tipo di puntatore per determinare se viene premuto il primo pulsante esteso del mouse (XButton1).

  • IS_POINTER_FIFTHBUTTON_WPARAM(wParam): flag che indica se il puntatore specificato ha intrapreso la quinta azione. Le applicazioni che desiderano rispondere alla quinta azione devono recuperare informazioni specifiche del tipo di puntatore per determinare se viene premuto il secondo pulsante del mouse esteso (XButton2).

    Per altri dettagli, vedere Flag puntatore .

    Nota

    Un puntatore al passaggio del mouse non ha nessuno dei flag pulsante impostati. Questo è analogo a uno spostamento del mouse senza pulsanti del mouse verso il basso. Un'applicazione può determinare gli stati dei pulsanti di una penna al passaggio del mouse, ad esempio chiamando GetPointerPenInfo ed esaminando i flag che specificano gli stati del pulsante.

lParam

Contiene la posizione del punto del puntatore.

Nota

Poiché il puntatore può contattare il dispositivo su un'area non semplice, questa posizione può essere una semplificazione di un'area puntatore più complessa. Quando possibile, un'applicazione deve usare le informazioni complete sull'area del puntatore anziché la posizione del punto.

Utilizzare le macro seguenti per recuperare le coordinate fisiche dello schermo del punto.

  • GET_X_LPARAM(lParam): coordinata x (punto orizzontale).
  • GET_Y_LPARAM(lParam): coordinata y (punto verticale).

Valore restituito

Se un'applicazione elabora questo messaggio, deve restituire zero.

Se l'applicazione non elabora questo messaggio, deve chiamare DefWindowProc.

Osservazioni:

! [Importante]
Quando una finestra perde l'acquisizione di un puntatore e riceve la notifica di WM_POINTERCAPTURECHANGED , in genere non riceverà altre notifiche. Per questo motivo, è importante non fare ipotesi basate su WM_POINTERDOWN WM_POINTERUP/ o WM_POINTERENTER/notifiche WM_POINTERLEAVE abbinate in modo uniforme.

Ogni puntatore ha un identificatore di puntatore univoco durante la sua durata. La durata di un puntatore inizia quando viene rilevata per la prima volta.

Se viene rilevato un puntatore al passaggio del mouse, viene generato un messaggio di WM_POINTERENTER. Viene generato un messaggio WM_POINTERDOWN seguito da un messaggio WM_POINTERENTER se viene rilevato un puntatore non al passaggio del mouse.

Durante la sua durata, un puntatore può generare una serie di messaggi WM_POINTERUPDATE mentre è al passaggio del mouse o nel contatto.

La durata di un puntatore termina quando non viene più rilevata. Verrà generato un messaggio di WM_POINTERLEAVE .

Quando un puntatore viene interrotto, viene impostato POINTER_FLAG_CANCELED .

Un messaggio WM_POINTERLEAVE può essere generato anche quando un puntatore non acquisito si sposta all'esterno dei limiti di una finestra.

Per ottenere la posizione orizzontale e verticale di un puntatore, usare quanto segue:

Usare il codice seguente per ottenere la posizione orizzontale e verticale:

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

La macro MAKEPOINTS può essere utilizzata anche per convertire il parametro lParam in una struttura POINTS.

La funzione GetKeyState può essere utilizzata per determinare gli stati dei tasti di modifica della tastiera associati a questo messaggio. Ad esempio, per rilevare che il tasto ALT è stato premuto, controllare se GetKeyState(VK_MENU) < 0.

Se l'applicazione non elabora questo messaggio, DefWindowProc può generare uno o più messaggi WM_GESTUREse la sequenza di input da questo e, possibilmente, altri puntatori vengono riconosciuti come movimento. Se un movimento non viene riconosciuto, DefWindowProc può generare l'input del mouse.

Se un'applicazione utilizza in modo selettivo un input puntatore e passa il resto a DefWindowProc, il comportamento risultante non è definito.

Utilizzare la funzione GetPointerInfo per recuperare ulteriori informazioni correlate a questo messaggio.

Esempi

Nell'esempio di codice seguente viene illustrato come recuperare la posizione x e y del puntatore associato a questo messaggio.

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

// process pointer up, similar to mouse button up

Nell'esempio di codice seguente viene illustrato come ottenere l'ID puntatore associato a questo messaggio.

POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);

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


Nell'esempio di codice seguente viene illustrato come gestire diversi tipi di puntatore associati a questo messaggio.

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

Requisiti

Requisito Valore
Client minimo supportato
Windows 8 [solo app desktop]
Server minimo supportato
Windows Server 2012 [solo app desktop]
Intestazione
Winuser.h (include Windows.h)

Vedi anche

Messaggi

Riferimento

Flag puntatore

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_edizione Standard CONDBUTTON_WPARAM

IS_POINTER_THIRDBUTTON_WPARAM

IS_POINTER_FOURTHBUTTON_WPARAM

IS_POINTER_FIFTHBUTTON_WPARAM