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

时间:2015-04-24 21:13:22

标签: c++ c winapi touch

我正在尝试使用WM_TOUCH,并希望检测鼠标事件是否是通过触摸/笔事件或实际鼠标事件合成的。

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

这很有效。 大多数的时间。如果我使用一根手指,一切都很好,但是如果我使用多个手指,则释放最后一根手指会导致鼠标移动GetMessageExtraInfo() == 0。此外,当窗口通过触摸失去焦点时,最多会生成3条带有GetMessageExtraInfo() == 0的鼠标移动消息。

是否有可靠的方式消除鼠标,触控和笔输入之间的歧义?

1 个答案:

答案 0 :(得分:4)

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

为了完整起见,这是完全正常的代码。代码依赖于仅在处理鼠标消息时有效的状态。在任何其他时间调用它都有不确定的行为:

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?