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

时间:2018-04-27 05:32:39

标签: c++ windows winapi wacom

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

之前我没有处理指针消息,因此手写笔驱动程序发布的这些指针消息只是传递给DefWindowProcDefWindowProc只生成了像WM_LBUTTONDBLCLK这样的鼠标输入。

与鼠标消息WM_LBUTTONDBLCLK不同,没有指针消息会明确告诉您它是双击。我理解他们打算设计一组简洁的消息,并将其他所有内容都放在一个干净的单一结构中。 POINTER_PEN_INFO是包含与当前消息相关的所有信息的结构。我以为我可以在那里找到任何东西,可能还有一些标志表示WM_POINTERDOWN消息应被视为双击,但也没有任何内容。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以通过跟踪点击次数并按照与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_CXDOUBLECLICK)
    &&  abs(ptLastClickPos.y - ptClickPos.y) < GetSystemMetrics(SM_CYDOUBLECLICK))
    {
        // double-click!
    }
    else
    {
        dwLastClickTime = dwClickTime;
        ptLastClickPos = ptClickPos;
    }
}