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

标签 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 编程。

谢谢!

最佳答案

您可以通过跟踪点击并将每次点击与最后一次点击进行比较来实现这一点,方法与 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;
    }
}

关于c++ - 处理 WM_POINTER 消息时如何检测双击/点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50055814/

相关文章:

c++ - 如何痛饮省略前向声明

c++ - 从 qprintsupport 的源错误编译 Qt 5.3.1

c++ - 初始化结构 vector

c++ - 如何使用 C++ Win32 API 计算两个日期之间的天数?

delphi - 我可以从我的 Delphi 应用程序发出 Process Explorer 可以使用的调试符号吗?

c++ - 包括从 Windows 到 Linux 的 header 路径更改

java - 我可以在 Windows 64 位平台上安全使用的最大 Java 堆大小是多少?

windows - 从 Windows 运行 NPM 命令时的输出很丑陋

windows - 路径前缀\??\和\\?\

winapi - Websphere MQ C++ 客户端在 VS2013 中崩溃-库/链接器问题?