WM_POINTERUP-Meldung
Wird veröffentlicht, wenn ein Zeiger, der den Kontakt über den Clientbereich eines Fensters hergestellt hat, den Kontakt unterbricht. Diese Eingabenachricht zielt auf das Fenster ab, über das der Zeiger kontaktiert, und der Zeiger wird an diesem Punkt implizit im Fenster erfasst, sodass das Fenster weiterhin Eingabemeldungen einschließlich der WM_POINTERUP-Benachrichtigung für den Zeiger erhält, bis er den Kontakt unterbricht.
Ein Fenster empfängt diese Nachricht über seine WindowProc-Funktion.
[! Wichtig]
Desktop-Apps sollten DPI-bewusst sein. Wenn Ihre App keine DPI-Unterstützung hat, können Bildschirmkoordinaten, die in Zeigermeldungen und verwandten Strukturen enthalten sind, aufgrund der DPI-Virtualisierung ungenau erscheinen. Die DPI-Virtualisierung bietet Unterstützung für die automatische Skalierung für Anwendungen, die nicht DPI-bewusst sind und standardmäßig aktiv sind (Benutzer können sie deaktivieren). Weitere Informationen finden Sie unter Writing High-DPI Win32 Applications ( Schreiben von Win32-Anwendungen mit hohem DPI-Code).
#define WM_POINTERUP 0x0247
Parameter
-
wParam
-
Enthält Informationen zum Zeiger. Verwenden Sie die folgenden Makros, um Informationen aus dem wParam-Parameter abzurufen.
GET_POINTERID_WPARAM(wParam): Der Zeigerbezeichner.
IS_POINTER_NEW_WPARAM(wParam): Ein Flag, das angibt, ob diese Meldung die erste Eingabe darstellt, die von einem neuen Zeiger generiert wurde.
IS_POINTER_INRANGE_WPARAM(wParam): Ein Flag, das angibt, ob diese Nachricht während der Lebensdauer von einem Zeiger generiert wurde. Dieses Flag ist nicht für Meldungen festgelegt, die angeben, dass der Zeiger über einen linken Erkennungsbereich verfügt.
IS_POINTER_INCONTACT_WPARAM(wParam): Ein Flag, das angibt, ob diese Nachricht von einem Zeiger generiert wurde, der mit der Fensteroberfläche in Kontakt ist. Dieses Flag ist nicht für Meldungen festgelegt, die auf einen Zeigenzeiger zeigen.
IS_POINTER_PRIMARY_WPARAM(wParam): Gibt an, dass dieser Zeiger als primär festgelegt wurde.
IS_POINTER_FIRSTBUTTON_WPARAM(wParam): Ein Flag, das angibt, ob es eine primäre Aktion gibt.
- Dies entspricht einer linken Maustaste nach unten.
- Ein Berührungszeiger hat diese Menge, wenn er mit der Digitizeroberfläche in Kontakt ist.
- Ein Stiftzeiger hat diese Menge, wenn er mit der Digitizeroberfläche in Kontakt ist, ohne dass Schaltflächen gedrückt sind.
IS_POINTER_SECONDBUTTON_WPARAM(wParam): Ein Flag, das angibt, ob es eine sekundäre Aktion gibt.
- Dies entspricht einer nach unten gedrückten Maustaste.
- Ein Stiftzeiger hat diese Menge, wenn er mit der Digitizeroberfläche in Kontakt ist, während die Stifttaste gedrückt ist.
IS_POINTER_THIRDBUTTON_WPARAM(wParam): ein Flag, das angibt, ob eine oder mehrere tertiäre Aktionen basierend auf dem Zeigertyp durchgeführt werden. -Anwendungen, die auf tertiäre Aktionen reagieren möchten, müssen spezifische Informationen für den Zeigertyp abrufen, um zu bestimmen, welche Schaltflächen gedrückt werden. Beispielsweise kann eine Anwendung die Schaltflächenzustände eines Stifts bestimmen, indem getPointerPenInfo aufruft und die Flags untersucht werden, die Schaltflächenzustände angeben.
IS_POINTER_FOURTHBUTTON_WPARAM(wParam): Ein Flag, das angibt, ob der angegebene Zeiger die vierte Aktion verwendet hat. Anwendungen, die auf vierte Aktionen reagieren möchten, müssen spezifische Informationen für den Zeigertyp abrufen, um zu bestimmen, ob die erste erweiterte Mausschaltfläche (XButton1) gedrückt wird.
IS_POINTER_FIFTHBUTTON_WPARAM(wParam): Ein Flag, das angibt, ob der angegebene Zeiger die fünfte Aktion verwendet hat. Anwendungen, die auf fünfte Aktionen reagieren möchten, müssen spezifische Informationen für den Zeigertyp abrufen, um zu bestimmen, ob die zweite erweiterte Mausschaltfläche (XButton2) gedrückt wird.
Weitere Informationen finden Sie unter Zeigerflags.
Hinweis
Für einen zeigenden Zeiger ist keines der Schaltflächenflags festgelegt. Dies entspricht einer Mausbewegung, bei der keine Maustaste nach unten bewegt wird. Eine Anwendung kann die Schaltflächenzustände eines Hoverstifts bestimmen, z. B. durch Aufrufen von GetPointerPenInfo und Untersuchen der Flags, die Schaltflächenzustände angeben.
-
lParam
-
Enthält die Punktposition des Zeigers.
Hinweis
Da der Zeiger den Kontakt mit dem Gerät über einen nicht trivialen Bereich stellen kann, kann diese Punktposition eine Vereinfachung eines komplexeren Zeigerbereichs sein. Wenn möglich, sollte eine Anwendung die vollständigen Zeigerbereichsinformationen anstelle der Punktposition 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 Nachricht verarbeitet, sollte sie 0 (null) zurückgeben.
Wenn die Anwendung diese Meldung nicht verarbeiten kann, sollte sie DefWindowProc aufrufen.
Bemerkungen
[! Wichtig]
Wenn ein Fenster die Erfassung eines Zeigers verliert und die WM_POINTERCAPTURECHANGED empfängt, empfängt es in der Regel keine weiteren Benachrichtigungen. Aus diesem Grund ist es wichtig, dass Sie keine Annahmen treffen, die auf gleichmäßig gekoppelten WM_POINTERDOWN / WM_POINTERUP- oder WM_POINTERENTER / WM_POINTERLEAVE 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.
Eine WM_POINTERENTER wird generiert, wenn ein zeigeriger Zeiger erkannt wird. Eine WM_POINTERDOWN meldung gefolgt von einer WM_POINTERENTER wird generiert, wenn ein zeigerfreier Zeiger erkannt wird.
Während seiner Lebensdauer kann ein Zeiger eine Reihe von Nachrichten generieren WM_POINTERUPDATE während er darauf oder in Kontakt ist.
Die Lebensdauer eines Zeigers endet, wenn er nicht mehr erkannt wird. Dadurch wird eine WM_POINTERLEAVE generiert.
Wenn ein Zeiger abgebrochen wird, wird POINTER_FLAG_CANCELED festgelegt.
Eine WM_POINTERLEAVE meldung 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 erhalten, verwenden Sie Folgendes:
Verwenden Sie den folgenden Code, um die horizontale und vertikale Position zu erhalten:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
Das MAKEPOINTS-Makro kann auch verwendet werden, um den lParam-Parameter in eine POINTS-Struktur zu konvertieren.
Die GetKeyState-Funktion kann verwendet werden, um die Tastenzustände des Tastaturmodifizierers zu bestimmen, die dieser Meldung zugeordnet sind. Um beispielsweise zu erkennen, dass die ALT-TASTE gedrückt wurde, überprüfen Sie, ob GetKeyState(VK_MENU) < 0 ist.
Wenn die Anwendung diese Nachricht nicht verarbeiten kann, generiert DefWindowProc möglicherweise eine oder mehrere WM_GESTURE-Nachrichten,wenn die Eingabesequenz von dieser und ggf. andere Zeiger als Geste erkannt wird. Wenn eine Geste nicht erkannt wird, generiert DefWindowProc möglicherweise Mauseingaben.
Wenn eine Anwendung selektiv Zeigereingaben verwendet und den Rest an DefWindowProcübergibt, ist das resultierende Verhalten nicht definiert.
Verwenden Sie die GetPointerInfo-Funktion, um weitere Informationen zu dieser Nachricht abzurufen.
Beispiele
Das folgende Codebeispiel zeigt, wie die x- und y-Position des Zeigers abgerufen werden, der dieser Meldung zugeordnet ist.
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
// process pointer up, similar to mouse button up
Das folgende Codebeispiel zeigt, wie sie die dieser Meldung zugeordnete Zeiger-ID abrufen.
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 verschiedene Zeigertypen behandelt werden, die dieser Meldung zugeordnet sind.
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;
}
Requirements (Anforderungen)
| Anforderung | Wert |
|---|---|
| Unterstützte Mindestversion (Client) |
[Windows 8 Nur Desktop-Apps] |
| Unterstützte Mindestversion (Server) |
[Windows Server 2012 Nur Desktop-Apps] |
| Header |
|
Weitere Informationen
-
Referenz