c++ - 处理 WM_POINTER 消息时如何检测双击/点击?
问题描述
我正在尝试实施Pointer Input Messages
以替换窗口中的常规鼠标消息。我这样做是为了在我的程序中更好地支持手写笔输入。一切正常,除了双击。
我之前没有处理指针消息,所以手写笔驱动程序发布的这些指针消息只是传递给DefWindowProc
并DefWindowProc
生成了鼠标输入,如WM_LBUTTONDBLCLK
.
与 mouse message 不同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;
}
}
推荐阅读
- raspberry-pi - Raspberry PI:如何解决此“无法连接”问题?
- cmake - 如何使用 CMake FetchContent 链接 OpenSSL?
- arrays - 应该将所有找到的对象添加到数组中的函数,但发生了错误“预期表达式”
- c# - 有没有办法修复使用 Xamarin C# 找不到的 Runtime.cs 文件
- c# - 是否可以使用 .NET 5 Blazor 应用程序中的 Entity Framework 6 引用 .NET Framework 库?
- amazon-web-services - 如何将驻留在账户 A 中的 s3 存储桶的访问权限授予来自多个 aws 账户的不同 iam 用户?
- python - Python:如何将文件添加到带有时间戳的新目录?
- sql-server - 在 SQL Server 中创建公式
- geocode - Geocoder API - 从物理地址获取 Lat,Lng
- java - 使用 System.err.println() 时的奇怪行为