WinForms中的“Ghost”MouseMove事件

时间:2013-10-07 10:28:36

标签: c# winforms events mouseevent mousemove

我有一个自定义控件,通过处理NumericUpDowns事件,使用当前鼠标坐标更新两个MouseMove

然而,我遇到了一个奇怪的情况,MouseMove事件被触发,即使这不应该发生(我已经关闭了我的无线鼠标并禁用了触控板)。因此,即使鼠标不移动,也会发生MouseMove

我做了一个简单的检查并验证了在这些“ghost”MouseMove事件之间,鼠标指针的位置没有改变。我利用这个有利于确保处理事件的方法仅在指针实际移动时调用,因此我能够满足应用程序的要求。

然而,我仍然感到困惑,因为当我禁用所有鼠标/触控板时,我不明白什么可以触发MouseMove事件。在Visual Studio中查看调用堆栈,在我看来,MouseMove事件的触发是“真实的”,就像鼠标真的移动一样,而不是像应用程序的其他部分一样被触发(例如,模拟MouseMove)。

有关这可能是什么原因的任何建议?谢谢!

编辑:按照King King的建议,我每次检测到MouseMove的消息时都修改了代码以打印字符串。我注意到当鼠标关闭且指针悬停在控件上时,当我在Alt-Tab之间切换应用程序时,会打印字符串。也许这与正在重绘的应用程序有关?

1 个答案:

答案 0 :(得分:2)

Windows有时会合成假的WM_MOUSEMOVE消息。特别是在从一个窗口到另一个窗口的焦点变化时会发生这种情况。获得焦点的窗口也会获得移动消息。使用Alt + Tab时会发现这种情况,这确实是消息的来源。

这完全是故意的。它确保将发生由WM_MOUSEMOVE触发的另一系列消息。特别是WM_NCHITTEST和WM_SETCURSOR。这样就可以显示正确的鼠标光标形状。否则由Control.Cursor和Application.UseWaitCursor属性在Winforms中受到影响。

你必须忍受这一点,确保这绝不是问题。