4

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

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

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

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

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

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

4

1 回答 1

5

Windows 有时会合成虚假的 WM_MOUSEMOVE 消息。这尤其会发生在从一个窗口到另一个窗口的焦点更改上。获得焦点的窗口也会获得移动消息。当您使用 Alt+Tab 时看到这种情况发生是一个很好的线索,这确实是消息的来源。

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

你必须忍受这个,确保这永远不是问题。

于 2013-10-07T13:10:30.023 回答