Freigeben über


WM_POINTERDOWN-Meldung

Wird gepostet, wenn ein Zeiger den Client-Bereich eines Fensters berührt. Diese Eingabenachricht zielt auf das Fenster ab, über dem der Zeiger Kontakt aufnimmt, und der Zeiger wird implizit an das Fenster gebunden, so dass das Fenster weiterhin Eingaben für den Zeiger erhält, bis es den Kontakt abbricht.

Ein Fenster empfängt diese Meldung über die WindowProc-Funktion.

![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_POINTERDOWN                   0x0246

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

![Wichtig]
Wenn ein Fenster die Erfassung eines Zeigers verliert und die Benachrichtigung WM_POINTERCAPTURECHANGED erhält, erhält es normalerweise keine weiteren Benachrichtigungen. Aus diesem Grund ist es wichtig, dass Sie keine Annahmen machen, die auf gleichmäßig gekoppelten /WM_POINTERDOWNWM_POINTERUP oder WM_POINTERENTER/WM_POINTERLEAVE Benachrichtigungen basieren.

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

Um den Parameter lParam in eine POINTS)-Struktur umzuwandeln, verwenden Sie das Makro MAKEPOINTS.

Um weitere Informationen zur Nachricht abzurufen, verwenden Sie die Funktion GetPointerInfo.

Verwenden Sie die Funktion GetKeyState, um die mit dieser Nachricht verknüpften Tastenzustände der Zusatztasten zu ermitteln. Um zu erkennen, ob die ALT-Taste gedrückt wurde, überprüfen Sie, ob GetKeyState (VK_MENU) gleich < 0 ist.

Beachten Sie, dass DefWindowProc, wenn die Anwendung diese Nachricht nicht verarbeitet, eine oder mehrere WM_GESTURE-Nachrichten erzeugen kann, wenn die Abfolge der Eingaben von diesem und möglicherweise anderen Zeigern 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.

Wenn ein Fenster die Erfassung eines Zeigers verliert und die Benachrichtigung WM_POINTERCAPTURECHANGED erhält, erhält es normalerweise keine weiteren Benachrichtigungen. Daher ist es wichtig, dass ein Fenster keine Annahmen über seinen Zeigerstatus macht, unabhängig davon, ob es gleichmäßig gepaarte UNTEN/OBEN- oder ERFASSEN/WEGLASSEN-Benachrichtigungen erhält.

Beispiele

Im folgenden Codebeispiel wird gezeigt, wie Sie IS_POINTER_FIRSTBUTTON_WPARAM, GET_X_LPARAM, GET_Y_LPARAM und IS_POINTER_SECONDBUTTON_WPARAM verwenden, um die relevanten Informationen abzurufen, die der WM_POINTERDOWN-Nachricht zugeordnet sind.

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

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

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

POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);

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

Das folgende Codebeispiel zeigt, wie unterschiedliche Zeigertypen wie Toucheingabe, Stift oder Standardzeigergeräte behandelt werden.

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

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