eln*_*gno 5 c# events mouseevent mousemove winforms
我有一个自定义控件NumericUpDowns
,该控件通过处理MouseMove
事件用当前鼠标坐标更新两个。
但是,我遇到了一个奇怪的情况,MouseMove
即使不应该发生也触发了事件(我已经关闭了无线鼠标并禁用了触控板)。因此,MouseMove
即使鼠标不移动,也会发生这种情况。
我进行了简单的检查,并验证了在这些“重影” MouseMove
事件之间鼠标指针的位置没有改变。我利用了这一点,以确保仅在指针实际移动时才调用处理事件的方法,因此我能够满足我的应用程序的要求。
但是,我仍然感到困惑,因为我不了解在禁用所有鼠标/触控板后,什么会触发MouseMove事件。查看Visual Studio中的调用堆栈,在我看来,MouseMove
事件的触发是“真正的”,就好像鼠标确实在移动,而不是好像它是由应用程序的其他部分触发的(例如,模拟MouseMove
) 。
关于这可能是什么原因的任何建议?谢谢!
编辑:根据King King的建议,我修改了代码以在每次MouseMove
检测到该消息时打印一个字符串。我注意到,当鼠标关闭并且指针悬停在控件上时,在我按Alt-Tab键在应用程序之间切换时会打印字符串。也许这与正在重绘的应用程序有关?
Windows有时会合成伪造的WM_MOUSEMOVE消息。特别是从一个窗口到另一个窗口的焦点更改时,会发生这种情况。获得焦点的窗口也会获得移动消息。当您使用Alt + Tab时看到这种情况的发生是一个很好的线索,它确实是消息的来源。
这完全是故意的。它确保将发生由WM_MOUSEMOVE触发的其他一系列消息。特别是WM_NCHITTEST和WM_SETCURSOR。这样可以显示正确的鼠标光标形状。否则,在Winforms中会受到Control.Cursor和Application.UseWaitCursor属性的影响。
您将不得不忍受这一点,请确保这绝不是问题。