c++ - 检测 WM_MOUSEMOVE 是否由触摸/笔引起

标签 c++ c winapi touch

我正在试验 WM_TOUCH 并想检测鼠标事件是从触摸/笔事件合成还是由于实际鼠标事件。

官方根据MSDN解决是检查 GetMessageExtraInfo() 的结果是否将高 24 位设置为 0xFF515700

这行得通。 大部分时间。如果我使用一根手指,一切都很好,但如果我使用多个手指,松开最后一根手指会导致鼠标移动,GetMessageExtraInfo() == 0。此外,当窗口通过触摸失去焦点时,将生成最多 3 strip 有 GetMessageExtraInfo() == 0 的鼠标移动消息。

是否有可靠的方式来区分鼠标、触摸和笔输入?

最佳答案

您发布的链接确实显示了区分物理鼠标生成的鼠标消息与响应触摸和笔输入而合成的鼠标消息的唯一可靠方法。

为了完整起见,这里是完整的工作代码。该代码依赖于仅在处理鼠标消息时有效的状态。在任何其他时间调用它都有未定义的行为:

bool IsTouchEvent() {
    const LONG_PTR c_SIGNATURE_MASK = 0xFFFFFF00;
    const LONG_PTR c_MOUSEEVENTF_FROMTOUCH = 0xFF515700;

    LONG_PTR extraInfo = GetMessageExtraInfo();
    return ( ( extraInfo & c_SIGNATURE_MASK ) == c_MOUSEEVENTF_FROMTOUCH );
}

您观察到的附加 WM_MOUSEMOVE 消息是系统如何实现其内部簿记的产物。例如,如果一个窗口被显示或隐藏,鼠标光标现在可能在另一个窗口上,需要重新计算。为此,系统合成了一条人工 WM_MOUSEMOVE 消息。

此效果在 Raymond Chen 的博客中有解释:Why do I get spurious WM_MOUSEMOVE messages? .

关于c++ - 检测 WM_MOUSEMOVE 是否由触摸/笔引起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29857587/

相关文章:

c++ - 用Qt3D画三角形

c - C 结构体中可变长度数组的奇怪行为

c# - Windows,在显示之前过滤鼠标设备输入?有一些关于入门的问题

winapi - Win32 : API calls to list available network shares on a server?

c++ - 以编程方式为所有用户设置注册表软件策略 key

java - 特定旅行商变体的实现

c++ - opengl 中的缓冲区数据问题 = 仅当我缓冲的字节数超过需要时才绘制

c - 如何在基于 Linux 的系统上的 c 程序中使用 mqueue?

c - 为什么当我改变变量的值时输出会改变?

c++ - 如何使用qt5(QtQuick 2.1)及以上版本在窗口上打印度数符号