Udostępnij za pośrednictwem


komunikat WM_POINTERUPDATE

Wysłana w celu udostępnienia aktualizacji wskaźnika, który nawiązał kontakt w obszarze klienta okna lub na zatrzymaniu wskaźnika nieuchwyconego wskaźnika nad obszarem klienta okna. Wskaźnik jest umieszczany na wskaźniku myszy, ale komunikat jest przeznaczony dla każdego okna, w którym wskaźnik się skończył. Wskaźnik jest w kontakcie z powierzchnią, ale wskaźnik jest niejawnie przechwytywany do okna, w którym wskaźnik nawiązał kontakt, a to okno nadal odbiera dane wejściowe wskaźnika do momentu przerwania kontaktu.

! [Ważne]
Aplikacje klasyczne powinny mieć świadomość DPI. Jeśli aplikacja nie rozpozna dpi, współrzędne ekranu zawarte w komunikatach wskaźnika i powiązanych strukturach mogą wydawać się niedokładne z powodu wirtualizacji DPI. Wirtualizacja DPI zapewnia automatyczną obsługę skalowania dla aplikacji, które nie obsługują dpi i są domyślnie aktywne (użytkownicy mogą ją wyłączyć). Aby uzyskać więcej informacji, zobacz Pisanie aplikacji win32 High-DPI.

#define WM_POINTERUPDATE              0x0245

Parametry

wParam

Zawiera informacje o wskaźniku. Użyj poniższych makr, aby pobrać informacje z parametru wParam.

  • GET_POINTERID_WPARAM(wParam): identyfikator wskaźnika.

  • IS_POINTER_NEW_WPARAM(wParam): flaga wskazująca, czy ten komunikat reprezentuje pierwsze dane wejściowe wygenerowane przez nowy wskaźnik.

  • IS_POINTER_INRANGE_WPARAM(wParam): flaga wskazująca, czy ten komunikat został wygenerowany przez wskaźnik w okresie jego istnienia. Ta flaga nie jest ustawiona w komunikatach, które wskazują, że wskaźnik ma zakres wykrywania po lewej stronie

  • IS_POINTER_INCONTACT_WPARAM(wParam): flaga wskazująca, czy ten komunikat został wygenerowany przez wskaźnik, który jest w kontakcie z powierzchnią okna. Ta flaga nie jest ustawiona dla komunikatów, które wskazują wskaźnik aktywowania.

  • IS_POINTER_PRIMARY_WPARAM(wParam): wskazuje, że ten wskaźnik został wyznaczony jako podstawowy.

  • IS_POINTER_FIRSTBUTTON_WPARAM(wParam): flaga wskazująca, czy istnieje akcja podstawowa.

    • Jest to analogiczne do lewego przycisku myszy w dół.
    • Wskaźnik dotykowy będzie miał ten zestaw, gdy ma kontakt z powierzchnią cyfry.
    • Wskaźnik pióra będzie miał ten zestaw, gdy jest w kontakcie z powierzchnią cyfryzatora bez naciśnięcia przycisków.
  • IS_POINTER_SECONDBUTTON_WPARAM(wParam): flaga wskazująca, czy istnieje akcja pomocnicza.

    • Jest to analogiczne do prawego przycisku myszy w dół.
    • Wskaźnik pióra będzie miał ten zestaw, gdy jest w kontakcie z powierzchnią cyfry z naciśnięciem przycisku beczki pióra.
  • IS_POINTER_THIRDBUTTON_WPARAM(wParam): flaga wskazująca, czy istnieją co najmniej jedno akcje tertiarne na podstawie typu wskaźnika; aplikacje, które chcą reagować na akcje tertiarne, muszą pobierać informacje specyficzne dla typu wskaźnika, aby określić, które przyciski tertiarne są naciskane. Na przykład aplikacja może określić stany przycisków pióra, wywołując GetPointerPenInfo i sprawdzając flagi określające stany przycisków.

  • IS_POINTER_FOURTHBUTTON_WPARAM(wParam): flaga wskazująca, czy określony wskaźnik podjął czwartą akcję. Aplikacje, które chcą odpowiedzieć na czwarte akcje, muszą pobrać informacje specyficzne dla typu wskaźnika, aby określić, czy pierwszy rozszerzony przycisk myszy (XButton1) jest naciśnięty.

  • IS_POINTER_FIFTHBUTTON_WPARAM(wParam): flaga wskazująca, czy określony wskaźnik podjął piątą akcję. Aplikacje, które chcą odpowiedzieć na piąte akcje, muszą pobrać informacje specyficzne dla typu wskaźnika, aby określić, czy drugi rozszerzony przycisk myszy (XButton2) jest naciśnięty.

    Aby uzyskać więcej informacji, zobacz flagi wskaźnika.

    Nuta

    Wskaźnik aktywowania nie ma ustawionych flag przycisku. Jest to analogiczne do ruchu myszy bez przycisków myszy w dół. Aplikacja może określić stany przycisków pióra aktywowania, na przykład wywołując GetPointerPenInfo i sprawdzając flagi określające stany przycisku.

lParam

Zawiera lokalizację punktu wskaźnika.

Nuta

Ponieważ wskaźnik może nawiązać kontakt z urządzeniem w obszarze innym niż trywialny, lokalizacja punktu może być uproszczeniem bardziej złożonego obszaru wskaźnika. Jeśli to możliwe, aplikacja powinna używać pełnych informacji o obszarze wskaźnika zamiast lokalizacji punktu.

Użyj poniższych makr, aby pobrać współrzędne ekranu fizycznego punktu.

Wartość zwracana

Jeśli aplikacja przetwarza ten komunikat, powinna zwrócić zero.

Jeśli aplikacja nie przetworzy tego komunikatu, powinna wywołać DefWindowProc.

Uwagi

Każdy wskaźnik ma unikatowy identyfikator wskaźnika w okresie jego istnienia. Okres istnienia wskaźnika rozpoczyna się po pierwszym wykryciu.

Jeśli zostanie wykryty wskaźnik aktywowania, zostanie wygenerowany komunikat WM_POINTERENTER. Komunikat WM_POINTERDOWN, po którym następuje komunikat WM_POINTERENTER, jest generowany, jeśli zostanie wykryty wskaźnik bez aktywowania.

W okresie istnienia wskaźnik może wygenerować serię komunikatów WM_POINTERUPDATE, gdy znajduje się na nim wskaźnik lub kontakt.

Okres istnienia wskaźnika kończy się, gdy nie jest już wykrywany. Spowoduje to wygenerowanie komunikatu WM_POINTERLEAVE.

Po przerwaniu wskaźnika POINTER_FLAG_CANCELED jest ustawiona.

Komunikat WM_POINTERLEAVE może być również generowany, gdy wskaźnik nieuchwycony jest przesuwany poza granice okna.

Aby uzyskać położenie wskaźnika w poziomie i w pionie, użyj następującego polecenia:

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

Makro MAKEPOINTS może również służyć do konwertowania parametru lParam na POINTS struktury.

Funkcja GetKeyState może służyć do określania stanów modyfikatora klawiatury skojarzonych z tym komunikatem. Aby na przykład wykryć, że ALT został naciśnięty, sprawdź, czy getKeyState (VK_MENU) < 0.

Jeśli aplikacja nie przetworzy tego komunikatu, defWindowProc może wygenerować jeden lub więcej komunikatów WM_GESTURE, jeśli sekwencja danych wejściowych z tego i, być może, inne wskaźniki są rozpoznawane jako gest. Jeśli gest nie zostanie rozpoznany, DefWindowProc może wygenerować dane wejściowe myszy.

Jeśli aplikacja selektywnie używa niektórych danych wejściowych wskaźnika i przekazuje resztę do DefWindowProc, wynikowe zachowanie jest niezdefiniowane.

Użyj funkcji GetPointerInfo, aby pobrać więcej informacji związanych z tym komunikatem.

Jeśli aplikacja nie przetwarza tych komunikatów tak szybko, jak są generowane, niektóre ruchy mogą być zesłane. Historię danych wejściowych, które zostały połączyć w ten komunikat, można pobrać przy użyciu funkcji GetPointerInfoHistory.

Przykłady

Poniższy przykład kodu pokazuje, jak używać parametrów GET_X_LPARAM, GET_Y_LPARAM, IS_POINTER_FIRSTBUTTON_WPARAMi IS_POINTER_SECONDBUTTON_WPARAM w celu pobrania odpowiednich informacji z parametrów wParam i lParam komunikatu WM_POINTERUPDATE.

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
}

Poniższy przykład kodu pokazuje, jak użyć GET_POINTERID_WPARAM do pobrania identyfikatora wskaźnika z parametru wParam komunikatu WM_POINTERUPDATE.

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
}

W poniższym przykładzie kodu pokazano, jak obsługiwać różne typy wskaźników.

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

Wymagania

Wymaganie Wartość
Minimalny obsługiwany klient
Windows 8 [tylko aplikacje klasyczne]
Minimalny obsługiwany serwer
Windows Server 2012 [tylko aplikacje klasyczne]
Nagłówek
Winuser.h (uwzględnij windows.h)

Zobacz też

wiadomości

referencyjne

flagi wskaźnika

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