Sdílet prostřednictvím


zpráva WM_POINTERDOWN

Publikováno, když ukazatel provede kontakt přes klientskou oblast okna. Tato vstupní zpráva cílí na okno, nad kterým ukazatel kontaktuje, a ukazatel je implicitně zachycen do okna, aby okno nadále přijímalo vstup pro ukazatel, dokud nepřeruší kontakt.

Okno obdrží tuto zprávu prostřednictvím funkce WindowProc.

! [Důležité]
Desktopové aplikace by měly být v rozlišení DPI. Pokud vaše aplikace nezná DPI, můžou se souřadnice obrazovky obsažené ve zprávách ukazatelů a souvisejících strukturách zobrazovat nepřesně kvůli virtualizaci DPI. Virtualizace DPI poskytuje podporu automatického škálování pro aplikace, které nepodporují DPI a jsou ve výchozím nastavení aktivní (uživatelé ho můžou vypnout). Další informace naleznete v tématu Psaní High-DPI aplikace Win32.

#define WM_POINTERDOWN                   0x0246

Parametry

wParam

Obsahuje informace o ukazateli. K načtení informací z parametru wParam použijte následující makra.

  • GET_POINTERID_WPARAM(wParam): identifikátor ukazatele.

  • IS_POINTER_NEW_WPARAM(wParam): příznak, který označuje, zda tato zpráva představuje první vstup vygenerovaný novým ukazatelem.

  • IS_POINTER_INRANGE_WPARAM(wParam): příznak, který označuje, jestli byla tato zpráva generována ukazatelem během své životnosti. Tento příznak není nastavený u zpráv, které indikují, že ukazatel má levý rozsah detekce.

  • IS_POINTER_INCONTACT_WPARAM(wParam): Příznak označující, jestli byla tato zpráva generována ukazatelem, který je v kontaktu s povrchem okna. Tento příznak není nastaven u zpráv, které označují ukazatel myši.

  • IS_POINTER_PRIMARY_WPARAM(wParam): označuje, že tento ukazatel byl označen jako primární.

  • IS_POINTER_FIRSTBUTTON_WPARAM(wParam): příznak označující, jestli existuje primární akce.

    • To je analogické s levým tlačítkem myši dolů.
    • Ukazatel dotykového ovládání bude mít tuto sadu, když je v kontaktu s povrchem digitizátoru.
    • Ukazatel pera bude mít tuto sadu, když je v kontaktu s povrchem digitizátoru bez stisknutí tlačítek.
  • IS_POINTER_SECONDBUTTON_WPARAM(wParam): příznak, který označuje, jestli existuje sekundární akce.

    • To je analogické s pravým tlačítkem myši dolů.
    • Ukazatel pera bude mít tuto sadu, když je v kontaktu s povrchem digitizátoru s stisknutím tlačítka pera.
  • IS_POINTER_THIRDBUTTON_WPARAM(wParam): příznak, který označuje, zda existuje jedna nebo více terciárních akcí na základě typu ukazatele; aplikace, které chtějí reagovat na terciární akce, musí načíst informace specifické pro typ ukazatele, aby bylo možné určit, která terciární tlačítka jsou stisknuta. Aplikace může například určit stavy tlačítek pera voláním GetPointerPenInfo a zkoumáním příznaků, které určují stavy tlačítek.

  • IS_POINTER_FOURTHBUTTON_WPARAM(wParam): příznak označující, jestli zadaný ukazatel provedl čtvrtou akci. Aplikace, které chtějí reagovat na čtvrté akce, musí načíst informace specifické pro typ ukazatele, aby bylo možné určit, zda je stisknuto první rozšířené tlačítko myši (XButton1).

  • IS_POINTER_FIFTHBUTTON_WPARAM(wParam): příznak označující, jestli zadaný ukazatel provedl pátou akci. Aplikace, které chtějí reagovat na páté akce, musí načíst informace specifické pro typ ukazatele a určit, zda je stisknuto druhé rozšířené tlačítko myši (XButton2).

    Další podrobnosti najdete v příznaky ukazatele.

    Poznámka

    Ukazatel při najetí myší nemá žádný z nastavených příznaků tlačítek. To je analogické k pohybu myší bez tlačítek myši dolů. Aplikace může určit stavy tlačítek pera pro najetí myší, například voláním GetPointerPenInfo a prozkoumáním příznaků, které určují stavy tlačítek.

lParam

Obsahuje umístění bodu ukazatele.

Poznámka

Vzhledem k tomu, že ukazatel může spojit se zařízením přes nesouvisenou oblast, může být toto umístění bodu zjednodušením složitější oblasti ukazatele. Kdykoli je to možné, aplikace by měla místo umístění bodu použít úplné informace o oblasti ukazatele.

Pomocí následujících maker načtěte souřadnice fyzické obrazovky bodu.

Návratová hodnota

Pokud aplikace tuto zprávu zpracuje, měla by vrátit nulu.

Pokud aplikace tuto zprávu nezpracuje, měla by volat DefWindowProc.

Poznámky

! [Důležité]
Když okno ztratí zachycení ukazatele a obdrží oznámení WM_POINTERCAPTURECHANGED, obvykle neobdrží žádná další oznámení. Z tohoto důvodu je důležité, abyste neprováděli žádné předpoklady na základě rovnoměrně spárovaných WM_POINTERDOWN/WM_POINTERUP nebo WM_POINTERENTER/WM_POINTERLEAVE oznámení.

Každý ukazatel má během své životnosti jedinečný identifikátor ukazatele. Doba života ukazatele začíná při prvním zjištění.

Pokud se zjistí ukazatel myši, vygeneruje se WM_POINTERENTER zpráva. WM_POINTERDOWN zpráva následovaná WM_POINTERENTER zprávou se vygeneruje, pokud se zjistí ukazatel, který není najet myší.

Během své životnosti může ukazatel vygenerovat řadu WM_POINTERUPDATE zpráv, když je najet myší nebo v kontaktu.

Doba života ukazatele skončí, když se už nezjistí. Tím se vygeneruje WM_POINTERLEAVE zpráva.

Když je ukazatel přerušen, POINTER_FLAG_CANCELED je nastaven.

Zpráva WM_POINTERLEAVE může být vygenerována také v případech, kdy se nezaznamenaný ukazatel přesune mimo hranice okna.

Chcete-li získat vodorovnou a svislou pozici ukazatele, použijte následující:

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

Pokud chcete převést parametr lParam na strukturu POINTS), použijte makro MAKEPOINTS.

Pokud chcete načíst další informace přidružené ke zprávě, použijte funkci GetPointerInfo.

Chcete-li určit stav modifikační klávesy klávesnice přidružené k této zprávě, použijte funkci GetKeyState. Pokud chcete například zjistit, že se stiskla klávesa ALT, zkontrolujte, jestli getKeyState(VK_MENU) < 0.

Všimněte si, že pokud aplikace tuto zprávu nezpracuje, DefWindowProc může vygenerovat jednu nebo více WM_GESTURE zpráv, pokud sekvence vstupu z tohoto a případně i jiné ukazatele jsou rozpoznány jako gesto. Pokud gesto není rozpoznáno, defWindowProc může generovat vstup myši.

Pokud aplikace selektivně spotřebovává určitý vstup ukazatele a předá zbytek DefWindowProc, výsledné chování není definováno.

Když okno ztratí zachycení ukazatele a obdrží oznámení WM_POINTERCAPTURECHANGED, obvykle neobdrží žádná další oznámení. Proto je důležité, aby okno neprovádí žádné předpoklady o stavu ukazatele, bez ohledu na to, zda obdrží rovnoměrně spárované DOWN / UP nebo ENTER / LEAVE oznámení.

Příklady

Následující příklad kódu ukazuje, jak použít IS_POINTER_FIRSTBUTTON_WPARAM, GET_X_LPARAM, GET_Y_LPARAMa IS_POINTER_SECONDBUTTON_WPARAMk načtení relevantních informací přidružených ke zprávě 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
}

Následující příklad kódu ukazuje, jak pomocí GET_POINTERID_WPARAM načíst ID ukazatele ze zprávy 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
}

Následující příklad kódu ukazuje, jak zpracovávat různé typy ukazatelů, jako je dotykové ovládání, pero nebo výchozí bodovací zařízení.

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

Požadavky

Požadavek Hodnota
Minimální podporovaný klient
Windows 8 [pouze desktopové aplikace]
Minimální podporovaný server
Windows Server 2012 [jenom desktopové aplikace]
Záhlaví
Winuser.h (včetně Windows.h)

Viz také

zprávy

referenční

příznaky ukazatele

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