如何模拟鼠标事件(Windows 窗体 .NET)
在 Windows 窗体中模拟鼠标事件不像模拟键盘事件那样直接。 Windows 窗体不提供帮助程序类来移动鼠标和调用鼠标单击操作。 控制鼠标的唯一方式是使用本机 Windows 方法。 如果你使用的是自定义控件或窗体,可模拟鼠标事件,但不能直接控制鼠标。
事件
大多数事件都具有调用这些事件的相应方法,以 On
后跟 EventName
的模式命名,如 OnMouseMove
。 这种方式只适用于自定义控件或窗体内,因为这些方法受到保护且不能从控件或窗体的上下文外访问。 使用方法(如 OnMouseMove
)的缺点在于,它不会实际控制鼠标或与控件交互,而只是引发关联的事件。 例如,如果你想模拟将鼠标悬停在 ListBox 中的某一项上,则 OnMouseMove
和 ListBox
不会以光标下的突出显示的项的方式直观地作出反应。
这些受保护的方法可用于模拟鼠标事件。
OnMouseDown
OnMouseEnter
OnMouseHover
OnMouseLeave
OnMouseMove
OnMouseUp
OnMouseWheel
OnMouseClick
OnMouseDoubleClick
有关这些事件的详细信息,请参阅使用鼠标事件(Windows 窗体 .NET)
调用单击
考虑到大多数控件在单击时会执行某些操作(如调用用户代码的按钮或更改其选中状态的复选框),Windows 窗体提供一种简单的方法来触发单击操作。 某些控件(如组合框)在单击时不会执行任何特殊操作,并且模拟单击不会对控件产生任何影响。
PerformClick
System.Windows.Forms.IButtonControl 接口提供模拟单击控件的 PerformClick 方法。 System.Windows.Forms.Button 和 System.Windows.Forms.LinkLabel 控件都实现此接口。
button1.PerformClick();
Button1.PerformClick()
InvokeClick
对于窗体的自定义控件,使用 InvokeOnClick 方法模拟鼠标单击。 这是一个受保护的方法,只能从窗体或派生的自定义控件中调用。
例如,以下代码从 button1
单击复选框。
private void button1_Click(object sender, EventArgs e)
{
InvokeOnClick(checkBox1, EventArgs.Empty);
}
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
InvokeOnClick(CheckBox1, EventArgs.Empty)
End Sub
使用本机 Windows 方法
Windows 提供了一些方法,你可调用这些方法来模拟鼠标移动和单击,如 User32.dll SendInput
和 User32.dll SetCursorPos
。 下面的示例将鼠标光标移动到控件的中心:
[DllImport("user32.dll", EntryPoint = "SetCursorPos")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetCursorPos(int x, int y);
private void button1_Click(object sender, EventArgs e)
{
Point position = PointToScreen(checkBox1.Location) + new Size(checkBox1.Width / 2, checkBox1.Height / 2);
SetCursorPos(position.X, position.Y);
}
<Runtime.InteropServices.DllImport("USER32.DLL", EntryPoint:="SetCursorPos")>
Public Shared Function SetCursorPos(x As Integer, y As Integer) As Boolean : End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim position As Point = PointToScreen(CheckBox1.Location) + New Size(CheckBox1.Width / 2, CheckBox1.Height / 2)
SetCursorPos(position.X, position.Y)
End Sub