WM_POINTERUP-Meldung
Wird gepostet, wenn ein Zeiger, der Kontakt über den Nicht-Clientbereich eines Fensters hergestellt hat, den Kontakt abbricht. Die Nachricht zielt auf das Fenster ab, über das der Zeiger Kontakt herstellt, und der Zeiger wird an diesem Punkt implizit im Fenster erfasst, sodass das Fenster weiterhin Eingabemeldungen für den Zeiger empfängt, bis er den Kontakt unterbricht, einschließlich der WM_POINTERUP-Benachrichtigung.
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_POINTERUP 0x0247
-
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).
Wenn eine Anwendung diese Meldung verarbeitet, sollte sie 0 (null) zurückgeben.
Wenn die Anwendung diese Meldung nicht verarbeitet, sollte sie DefWindowProc aufrufen.
![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:
Verwenden Sie den folgenden Code, um die horizontale und vertikale Position abzurufen:
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.
Beispiele
Das folgende Codebeispiel zeigt, wie Sie die x- und y-Position des Zeigers abrufen, der mit dieser Nachricht verbunden 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 mit dieser Nachricht verbundene Zeiger-ID erhalten.
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 Sie verschiedene Zeigertypen im Zusammenhang mit dieser Nachricht behandeln können.
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 |
|
Siehe auch
-
Referenz