Freigeben über


WM_POINTERUPDATE-Meldung

Wird gepostet, um einen Zeiger zu aktualisieren, der den Client-Bereich eines Fensters berührt hat, oder um einen schwebenden, nicht gefangenen Zeiger über dem Client-Bereich eines Fensters anzuzeigen. Während der Mauszeiger darauf zeigt, zielt die Meldung auf das Fenster ab, über dem sich der Mauszeiger gerade befindet. Während sich der Zeiger mit der Oberfläche in Kontakt befindet, wird der Zeiger implizit in dem Fenster erfasst, über dem der Zeiger den Kontakt hergestellt hat, und dieses Fenster empfängt weiterhin Eingaben für den Zeiger, bis er den Kontakt abbricht.

![Wichtig]
Desktop-Apps sollten DPI-Werte beachten. Wenn Ihre App keine DPI-Werte erkennt, können Bildschirmkoordinaten, die in Zeigermeldungen und verwandten Strukturen enthalten sind, aufgrund der DPI-Virtualisierung ungenau wirken. Die DPI-Virtualisierung bietet automatische Skalierungsunterstützung für Apps, die nicht DPI-fähig und standardmäßig aktiv sind (Benutzer können sie deaktivieren). Weitere Informationen finden Sie unter Schreiben von Win32-Anwendungen mit hohem DPI-Wert.

#define WM_POINTERUPDATE              0x0245

Parameter

wParam

Enthält Informationen zum Zeiger. Verwenden Sie die folgenden Makros, um Informationen aus dem Parameter wParam abzurufen.

  • GET_POINTERID_WPARAM(wParam): der Zeigerbezeichner.

  • IS_POINTER_NEW_WPARAM(wParam): ein Flag, das angibt, ob diese Nachricht die erste von einem neuen Zeiger erzeugte Eingabe darstellt.

  • IS_POINTER_INRANGE_WPARAM(wParam): ein Flag, das angibt, ob diese Nachricht von einem Zeiger während seiner Lebensdauer erzeugt wurde. Dieses Flag wird nicht bei Nachrichten gesetzt, die anzeigen, dass der Zeiger den Erfassungsbereich verlassen hat

  • IS_POINTER_INCONTACT_WPARAM(wParam): ein Flag, das angibt, ob diese Nachricht von einem Zeiger erzeugt wurde, der mit der Fensteroberfläche in Kontakt ist. Dieses Flag wird bei Nachrichten, die einen schwebenden Zeiger anzeigen, nicht gesetzt.

  • IS_POINTER_PRIMARY_WPARAM(wParam): zeigt an, dass dieser Zeiger als primär bezeichnet wurde.

  • IS_POINTER_FIRSTBUTTON_WPARAM(wParam): ein Flag, das anzeigt, ob es eine Primäraktion gibt.

    • Dies entspricht dem Drücken der linken Maustaste.
    • Bei einem Touchpointer ist dieser Wert eingestellt, wenn er mit der Oberfläche des Digitalisierungsgeräts in Kontakt ist.
    • Ein Stiftzeiger hat diese Einstellung, wenn er die Oberfläche des Digitalisierungsgeräts berührt und keine Tasten gedrückt sind.
  • IS_POINTER_SECONDBUTTON_WPARAM(wParam): ein Flag, das anzeigt, ob es eine Sekundäraktion gibt.

    • Dies entspricht dem Drücken der rechten Maustaste.
    • Ein Stiftzeiger hat diese Einstellung, wenn er bei gedrückter Stift-Drucktaste mit der Oberfläche des Digitalisierungsgeräts in Kontakt ist.
  • IS_POINTER_THIRDBUTTON_WPARAM(wParam): ein Flag, das angibt, ob es eine oder mehrere tertiäre Aktionen auf der Basis des Zeigertyps gibt. Anwendungen, die auf tertiäre Aktionen reagieren möchten, müssen die für den Zeigertyp spezifischen Informationen abrufen, um zu bestimmen, welche tertiären Tasten gedrückt werden. So kann eine Anwendung beispielsweise den Status der Tasten eines Stifts ermitteln, indem sie GetPointerPenInfo aufruft und die Flags prüft, die den Status der Tasten angeben.

  • IS_POINTER_FOURTHBUTTON_WPARAM(wParam): ein Flag, das angibt, ob der angegebene Zeiger die vierte Aktion ausgeführt hat. Anwendungen, die auf vierte Aktionen reagieren möchten, müssen die für den Zeigertyp spezifischen Informationen abrufen, um festzustellen, ob die erste erweiterte Maustaste (XButton1) gedrückt ist.

  • IS_POINTER_FIFTHBUTTON_WPARAM(wParam): a ein Flag, das angibt, ob der angegebene Zeiger eine fünfte Aktion durchgeführt hat.. Anwendungen, die auf fünfte Aktionen reagieren möchten, müssen die für den Zeigertyp spezifischen Informationen abrufen, um festzustellen, ob die zweite erweiterte Maustaste (XButton2) gedrückt ist.

    Siehe Zeiger-Flags für weitere Details.

    Hinweis

    Bei einem schwebenden Zeiger ist keines der Schaltflächen-Flags gesetzt. Dies ist vergleichbar mit einer Mausbewegung ohne gedrückte Maustasten. Eine Anwendung kann die Tastenstatus eines schwebenden Stifts ermitteln, indem sie z. B. GetPointerPenInfo aufruft und die Flags prüft, die die Tastenstatus angeben.

lParam

Enthält die Punktposition des Zeigers.

Hinweis

Da der Zeiger den Kontakt mit dem Gerät möglicherweise über einen nicht trivialen Bereich herstellt, kann diese Punktposition eine Vereinfachung eines komplexeren Zeigerbereichs sein. Wann immer möglich, sollte eine Anwendung anstelle der Punktposition die vollständigen Informationen des Zeigerbereichs verwenden.

Verwenden Sie die folgenden Makros, um die physischen Bildschirmkoordinaten des Punkts abzurufen.

  • GET_X_LPARAM(lParam): die X-Koordinate (horizontaler Punkt).
  • GET_Y_LPARAM(lParam): die Y-Koordinate (vertikaler Punkt).

Rückgabewert

Wenn eine Anwendung diese Meldung verarbeitet, sollte sie 0 (null) zurückgeben.

Wenn die Anwendung diese Meldung nicht verarbeitet, sollte sie DefWindowProc aufrufen.

Hinweise

Jeder Zeiger verfügt während seiner Lebensdauer über einen eindeutigen Zeigerbezeichner. Die Lebensdauer eines Zeigers beginnt, wenn er zum ersten Mal erkannt wird.

Wenn ein Zeiger erkannt wird, wird eine WM_POINTERENTER-Nachricht generiert. Eine WM_POINTERDOWN-Nachricht gefolgt von einer WM_POINTERENTER-Nachricht wird generiert, wenn ein nicht schwebender Zeiger erkannt wird.

Während der Lebensdauer kann ein Zeiger eine Reihe von WM_POINTERUPDATE-Nachrichten generieren, während er schwebt oder in Kontakt ist.

Die Lebensdauer eines Zeigers endet, wenn er nicht mehr erkannt wird. Dadurch wird eine WM_POINTERLEAVE-Nachricht generiert.

Wenn ein Zeiger aufgegeben wird, wird POINTER_FLAG_CANCELED gesetzt.

Eine WM_POINTERLEAVE-Nachricht kann auch generiert werden, wenn ein nicht erfasster Zeiger außerhalb der Grenzen eines Fensters bewegt wird.

Um die horizontale und vertikale Position eines Zeigers zu ermitteln, gehen Sie wie folgt vor:

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

Das Makro MAKEPOINTS kann auch verwendet werden, um den Parameter lParam in eine POINTS-Struktur umzuwandeln.

Mit der Funktion GetKeyState können Sie die Status der Tastatur-Zusatztasten ermitteln, die mit dieser Nachricht verbunden sind. Um zu erkennen, ob die ALT-Taste gedrückt wurde, überprüfen Sie, ob GetKeyState (VK_MENU) gleich < 0 ist.

Wenn die Anwendung diese Meldung nicht verarbeitet, generiert DefWindowProc möglicherweise eine oder mehrere WM_GESTURE-Nachrichten, wenn die Abfolge der Eingaben von diesem und möglicherweise andere Zeiger als Geste erkannt wird. Wenn eine Geste nicht erkannt wird, kann DefWindowProc eine Mauseingabe generieren.

Wenn eine Anwendung selektiv einige Zeigereingaben verbraucht und den Rest an DefWindowProc weitergibt, ist das resultierende Verhalten undefiniert.

Verwenden Sie die GetPointerInfo-Funktion, um weitere Informationen zu dieser Nachricht abzurufen.

Wenn die Anwendung diese Nachrichten nicht so schnell verarbeitet, wie sie generiert werden, werden einige Züge möglicherweise zusammengelegt. Der Verlauf der Eingaben, die in diese Nachricht zusammengeführt wurden, kann mithilfe der GetPointerInfoHistory-Funktion abgerufen werden.

Beispiele

Im folgenden Codebeispiel wird veranschaulicht, wie Sie GET_X_LPARAM, GET_Y_LPARAM, IS_POINTER_FIRSTBUTTON_WPARAM und IS_POINTER_SECONDBUTTON_WPARAM verwenden, um relevante Informationen aus den Parametern wParam und lParam der WM_POINTERUPDATE-Nachricht abzurufen.

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

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

Im folgenden Codebeispiel wird gezeigt, wie Sie GET_POINTERID_WPARAM verwenden, um die Zeiger-ID aus dem Parameter wParam der WM_POINTERUPDATE-Nachricht abzurufen.

POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);

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

Das folgende Codebeispiel zeigt, wie Sie mit verschiedene Zeigertypen umgehen können.

POINTER_TOUCH_INFO   touchInfo;
POINTER_PEN_INFO     penInfo;
POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);
POINTER_INPUT_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 = HandleGenericPointerInfo(&pointerInfo);
    }
    break;
}

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client)
Windows 8 [nur Desktop-Apps]
Unterstützte Mindestversion (Server)
Windows Server 2012 [nur Desktop-Apps]
Header
Winuser.h (einschließlich Windows.h)

Siehe auch

Meldungen

Referenz

Zeigerflags

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