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

问题描述 投票:0回答:1

我正在尝试 WM_TOUCH,并希望检测鼠标事件是由触摸/笔事件合成还是由“实际”鼠标事件合成。 根据

MSDN

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

0xFF515700

这有效。

大多数

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

GetMessageExtraInfo() == 0
的鼠标移动消息。

是否有一种

可靠

的方法来消除鼠标、触摸和笔输入之间的歧义?

c++ c winapi touch
1个回答
7
投票

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

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

.

© www.soinside.com 2019 - 2024. All rights reserved.