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

我正在尝试使用WM_TOUCH并想要检测鼠标事件是否是通过触摸/笔事件或由于实际的鼠标事件而合成的。

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

这很有效。 大多数时候。 如果我使用一根手指,一切都很好,但如果我使用多个手指,释放最后一根手指会导致鼠标移动GetMessageExtraInfo() == 0 。 此外,当窗口通过触摸失去焦点时,会生成最多3个带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的博客解释了这种效果: 为什么我会收到虚假的WM_MOUSEMOVE消息? 。