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

Joe*_*Joe 3 c c++ winapi touch

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

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

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

是否有一种可靠的方法来消除鼠标、触摸和笔输入之间的歧义?

IIn*_*ble 6

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

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

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 );
}
Run Code Online (Sandbox Code Playgroud)

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

Raymond Chen 的博客中解释了这种效果:为什么我会收到虚假的 WM_MOUSEMOVE 消息?.