Vb.net 鼠标事件轮最后出现

Vb.net 鼠标事件轮最后出现,vb.net,Vb.net,在我的应用程序中发生了一些奇怪的事情,我不知道它是什么。我试图以编程方式模拟鼠标单击和滚动 我可以通过编程成功地执行鼠标单击和滚动,但问题是鼠标滚轮最后出现 代码如下: 私有共享子鼠标_事件(ByVal dwFlags为UInteger,ByVal dx为 整数、ByVal dy作为整数、ByVal dwData作为整数、ByVal dwExtraInfo 作为一名专家) 端接头 旗帜: Const MOUSEEVENTF_LEFTDOWN作为UInteger=&H2'0x0002' Con

在我的应用程序中发生了一些奇怪的事情,我不知道它是什么。我试图以编程方式模拟鼠标单击和滚动

我可以通过编程成功地执行鼠标单击和滚动,但问题是鼠标滚轮最后出现

代码如下:


私有共享子鼠标_事件(ByVal dwFlags为UInteger,ByVal dx为
整数、ByVal dy作为整数、ByVal dwData作为整数、ByVal dwExtraInfo
作为一名专家)
端接头
旗帜:

Const MOUSEEVENTF_LEFTDOWN作为UInteger=&H2'0x0002'
Const MOUSEEVENTF_LEFTUP As UInteger=&H4'0x0004'
Const MOUSEEVENTF_车轮作为UInteger=&H800
Const MOUSEEVENTF_XDOWN As UInteger=&H80
私有子按钮3\u单击(发送者作为对象,e作为事件参数)处理按钮3。单击
滚动\u至\u结束()
线程。睡眠(300)
单击_perf()
MessageBox.Show(“S”)
端接头
专用子卷轴\u至\u结束()
“焦点小组1”
c_点=新点(Panel1.Location.X+1,Panel1.Location.Y+1)
Cursor.Position=Me.PointToScreen(c_点)
鼠标事件(鼠标事件左下,0,0,0,0)
鼠标事件(鼠标事件左起,0,0,0,0)
“等等”
线程。睡眠(150)
'滚动到页面末尾'
将向下滚动显示为整数=-(10*120)“执行10次向下滚动”
鼠标事件(鼠标事件滚轮,0,0,向下滚动,0)
“这就是解决办法:”
Application.DoEvents()
端接头
专用子单击_perf()
'沿对角线移动鼠标200px'
c_点X+=200
c_点Y+=200
Cursor.Position=Me.PointToScreen(c_点)
“执行单击”
鼠标事件(MOUSEEVENTF_LEFTDOWN,c_point.X,c_point.Y,0,0)
鼠标事件(鼠标事件左起,0,0,0,0)
端接头
当我单击按钮3时,我想对焦面板1,然后滚动到末端,沿对角线向下移动鼠标200px,然后模拟单击

实际发生的情况:鼠标移动到panel1,模拟按下鼠标按钮和向上按下鼠标按钮。然后,它将鼠标沿对角线方向移动200px,messagebox显示出来。滚动甚至没有出现,现在当我关闭messagebox面板1时,可能会失去焦点,无法滚动

如果我移除messagebox.show(“”):鼠标移动到panel1并像上面一样聚焦它。它滚动到最后,但在向下滚动之前执行单击

编辑:
要解决此问题,我们需要在滚轮鼠标事件之后放置
Application.DoEvents()

将此放置在每个UI操作之后,以强制其按顺序发生

Application.DoEvents()
UI事件在一个队列中处理,该队列查看消息并处理它们。如果它们在代码中几乎同时被提出,则不能保证它们将按照提出的顺序被处理,因为您的代码比循环快。将停止代码执行并强制循环处理所有挂起的消息,从而使它们按顺序发生

然而,由于其广泛的误用,使用这种方法通常被认为是不好的做法。我认为你的理由很好,也许是我见过的唯一一个


我很想知道是否有人能提供一个首选的替代方案…

如果你在每个步骤后放置
Application.DoEvents()
,该怎么办?@djv就是这样。非常感谢你!你能把它作为一个答案,也许能提供更多的信息吗?
MessageBox
不是一个调试工具;更不适合调试事件流,谢谢与我们分享!那很有帮助!