Udostępnij za pośrednictwem


komunikat WM_POINTERDOWN

Opublikowany, gdy wskaźnik nawiązuje kontakt przez obszar klienta okna. Ten komunikat wejściowy jest przeznaczony dla okna, w którym wskaźnik nawiązuje kontakt, a wskaźnik jest niejawnie przechwytywany w oknie, tak aby okno nadal odbierało dane wejściowe wskaźnika do momentu przerwania kontaktu.

Okno odbiera ten komunikat za pośrednictwem funkcji WindowProc.

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

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

! [Ważne]
Gdy okno utraci przechwycenie wskaźnika i otrzyma powiadomienie o WM_POINTERCAPTURECHANGED, zwykle nie będzie otrzymywać żadnych dalszych powiadomień. Z tego powodu ważne jest, aby nie wprowadzać żadnych założeń w oparciu o parowane równomiernie WM_POINTERDOWN/WM_POINTERUP lub powiadomienia WM_POINTERENTER/WM_POINTERLEAVE.

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

Aby przekonwertować parametr lParam na strukturę POINTS), użyj makra MAKEPOINTS.

Aby pobrać więcej informacji skojarzonych z komunikatem, użyj funkcji GetPointerInfo.

Aby określić stany modyfikujące klawiaturę skojarzone z tym komunikatem, użyj funkcji GetKeyState. Na przykład, aby wykryć, że ALT został naciśnięty, sprawdź, czy getKeyState(VK_MENU) < 0.

Należy pamiętać, że jeśli aplikacja nie przetworzy tego komunikatu, DefWindowProc może wygenerować co najmniej jeden komunikat WM_GESTURE, jeśli sekwencja danych wejściowych z tego i, prawdopodobnie, 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.

Gdy okno utraci przechwycenie wskaźnika i otrzyma powiadomienie WM_POINTERCAPTURECHANGED, zwykle nie będzie otrzymywać żadnych dalszych powiadomień. Dlatego ważne jest, aby okno nie przyjmuje żadnych założeń stanu wskaźnika, niezależnie od tego, czy otrzymuje parowane równomiernie powiadomienia DOWN / UP lub ENTER / LEAVE.

Przykłady

W poniższym przykładzie kodu pokazano, jak używać IS_POINTER_FIRSTBUTTON_WPARAM, GET_X_LPARAM, GET_Y_LPARAMi IS_POINTER_SECONDBUTTON_WPARAMw celu pobrania odpowiednich informacji skojarzonych z komunikatem WM_POINTERDOWN.

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
}

Poniższy przykład kodu przedstawia sposób użycia GET_POINTERID_WPARAM w celu pobrania identyfikatora wskaźnika z komunikatu WM_POINTERDOWN.

POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);

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

W poniższym przykładzie kodu pokazano, jak obsługiwać różne typy wskaźników, takie jak dotyk, pióro lub domyślne urządzenia wskazujące.

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

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