首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在处理WM_POINTER消息时如何检测双击/点击?

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

Stack Overflow用户
提问于 2018-04-27 05:32:38
回答 1查看 1.4K关注 0票数 1

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

我以前没有处理指针消息,所以这些由手写笔驱动程序发布的指针消息只是传递给DefWindowProc,而DefWindowProc只是生成鼠标输入,比如WM_LBUTTONDBLCLK

与鼠标消息WM_LBUTTONDBLCLK不同,没有指针消息会显式地告诉您这是双击。我理解他们设计一组简明扼要的信息的意图,并把其他的东西都设计成一个干净的单一结构。信息是包含与当前消息关联的所有信息的结构。我想我可以在那里找到任何东西,可能是一些标志,表明WM_POINTERDOWN消息应该被视为双击,但是没有任何东西。

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-27 08:00:09

您可以通过跟踪单击并将每一次单击与最后一次单击进行比较,以与Windows相同的方式进行此操作。

伪码:

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50055814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档