Sdílet prostřednictvím


zpráva WM_POINTERUPDATE

Publikováno, aby poskytla aktualizaci ukazatele, který kontaktoval v klientské oblasti okna nebo na ukazateli, který najede nechyceným ukazatelem na oblast klienta okna. Když ukazatel najede myší, cílí zpráva na okno, na které se ukazatel přepne. Když je ukazatel v kontaktu s povrchem, ukazatel se implicitně zachytí do okna, ve kterém ukazatel kontaktoval a že toto okno bude nadále přijímat vstup pro ukazatel, dokud neruší kontakt.

! [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_POINTERUPDATE              0x0245

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

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

Makro MAKEPOINTS lze také použít k převodu parametru lParam na POINTS struktury.

Funkci GetKeyState lze použít k určení stavů modifikátoru klávesnice přidružených k této zprávě. Pokud chcete například zjistit, že se stiskla klávesa ALT, zkontrolujte, jestli < 0 GetKeyState (VK_MENU).

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.

Pomocí funkce GetPointerInfo načtěte další informace související s touto zprávou.

Pokud aplikace tyto zprávy nezpracuje tak rychle, jak jsou generovány, některé přesuny mohou být sloučeny. Historii vstupů, které byly sloučeny do této zprávy lze načíst pomocí funkce GetPointerInfoHistory.

Příklady

Následující příklad kódu ukazuje, jak použít GET_X_LPARAM, GET_Y_LPARAM, IS_POINTER_FIRSTBUTTON_WPARAMa IS_POINTER_SECONDBUTTON_WPARAM k načtení relevantních informací z parametrů wParam a lParam zprávy 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
}

Následující příklad kódu ukazuje, jak použít GET_POINTERID_WPARAM k načtení ID ukazatele z wParam parametru WM_POINTERUPDATE zprávy.

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
}

Následující příklad kódu ukazuje, jak zpracovat různé typy ukazatelů.

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

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