处理WM_POINTER消息时,如何检测双击/点击

How to detect double-click/tap when handling WM_POINTER message?

本文关键字:检测 双击 点击 何检测 WM POINTER 消息 处理      更新时间:2023-10-16

我正在尝试实现 Pointer Input Messages以替换窗口中的常规鼠标消息。我这样做是为了更好地支持我程序中的手写笔输入。除了双击。

,一切都很好。

我以前没有处理指针消息,因此这些由Stylus驱动程序发布的指针消息刚刚传递给DefWindowProcDefWindowProc刚刚生成的鼠标输入,例如WM_LBUTTONDBLCLK

与鼠标消息WM_LBUTTONDBLCLK不同,没有指针消息可以明确地告诉您这是双击。我理解他们设计简洁的消息的意图,并以干净的单个结构制作其他所有内容。pointer_pen_info是包含与当前消息关联的所有信息的结构。我以为我可以在那里找到任何东西,也许有一些标志表明WM_POINTERDOWN消息应被视为双击,但也没有。

我错过了什么吗?如果没有,我还能做些什么来检测双击?我只能在MSDN上找到一些为Window XP编写的过时文档。我正在Windows 10上编程,Win32 API编程,使用C 编程。

谢谢!

您可以通过跟踪单击并以与Windows的方式相同的方式进行跟踪并将每个点击与最后一个。

进行比较。

伪代码:

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_CXDOUBLECLK)
    &&  abs(ptLastClickPos.y - ptClickPos.y) < GetSystemMetrics(SM_CYDOUBLECLK))
    {
        // double-click!
    }
    else
    {
        dwLastClickTime = dwClickTime;
        ptLastClickPos = ptClickPos;
    }
}