c ++ - Sådan registreres dobbeltklik/tryk, når du håndterer WM\_POINTER-besked?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at gennemføre Pointer Input Messages for at erstatte almindelig musemeddelelse i et vindue. Jeg gør dette for at få en bedre understøttelse af stylusindgangen i mit program. Alt fungerer fint bortset fra dobbeltklik.


Jeg har ikke behandlet pegerbesked før, så disse pegerbeskeder, der blev sendt af stylusdriveren, blev lige videregivet til DefWindowProc og DefWindowProc bare genereret musindgang som WM\_LBUTTONDBLCLK.


I modsætning til musemeddelelsen WM\_LBUTTONDBLCLK er der ingen pointermeddelelse, der udtrykkeligt vil fortælle dig at det er et dobbeltklik. Jeg forstår, at de har til hensigt at designe en kortfattet gruppe meddelelser og gøre alt andet i en ren enkelt struktur. POINTER\_PEN\_INFO er den strukturelle som indeholder alle de oplysninger, der er knyttet til den aktuelle besked. Jeg troede, at jeg kunne finde noget der, måske nogle flag, der tyder på, at en WM\_POINTERDOWN besked skal behandles som et dobbeltklik, men intet er der også. [8]]]


Er der noget jeg savnede? Hvis ikke, hvad mere kunne jeg gøre for at opdage et dobbeltklik? Jeg kunne kun finde nogle forældede dokumenter, der var skrevet til Window XP på MSDN. Jeg programmerer på Windows 10, Win32 API programmering med C ++.


Tak skal du have!

Bedste reference


Du kan gøre dette ved at spore klik og sammenligne hvert klik til det sidste på samme måde som Windows gør.


Psuedo-kode:


POINT ptLastClickPos;
DWORD dwLastClickTime;

if (uMsg == WM\_POINTERDOWN)
{
    DWORD dwClickTime = GetMessageTime();
    POINT ptClickPos = { GET\_X\_LPARAM(lParam), GET\_Y\_LPARAM(lParam) };

    if (dwLastClickTime + GetDoubleClickTime() > dwClickTime
    &&  abs(ptLastClickPos.x - ptClickPos.x) < GetSystemMetrics(SM\_CXDOUBLECLICK)
    &&  abs(ptLastClickPos.y - ptClickPos.y) < GetSystemMetrics(SM\_CYDOUBLECLICK))
    {
        // double-click!
    }
    else
    {
        dwLastClickTime = dwClickTime;
        ptLastClickPos = ptClickPos;
    }
}