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消息?

链接地址: http://www.djcxy.com/p/39245.html

上一篇: MOUSEMOVE is caused by touch/pen

下一篇: c++