如何模拟鼠标事件(Windows 窗体 .NET)

在 Windows 窗体中模拟鼠标事件不像模拟键盘事件那样直接。 Windows 窗体不提供帮助程序类来移动鼠标和调用鼠标单击操作。 控制鼠标的唯一方式是使用本机 Windows 方法。 如果你使用的是自定义控件或窗体,可模拟鼠标事件,但不能直接控制鼠标。

事件

大多数事件都具有调用这些事件的相应方法,以 On 后跟 EventName 的模式命名,如 OnMouseMove。 这种方式只适用于自定义控件或窗体内,因为这些方法受到保护且不能从控件或窗体的上下文外访问。 使用方法(如 OnMouseMove)的缺点在于,它不会实际控制鼠标或与控件交互,而只是引发关联的事件。 例如,如果你想模拟将鼠标悬停在 ListBox 中的某一项上,则 OnMouseMoveListBox 不会以光标下的突出显示的项的方式直观地作出反应。

这些受保护的方法可用于模拟鼠标事件。

  • OnMouseDown
  • OnMouseEnter
  • OnMouseHover
  • OnMouseLeave
  • OnMouseMove
  • OnMouseUp
  • OnMouseWheel
  • OnMouseClick
  • OnMouseDoubleClick

有关这些事件的详细信息,请参阅使用鼠标事件(Windows 窗体 .NET)

调用单击

考虑到大多数控件在单击时会执行某些操作(如调用用户代码的按钮或更改其选中状态的复选框),Windows 窗体提供一种简单的方法来触发单击操作。 某些控件(如组合框)在单击时不会执行任何特殊操作,并且模拟单击不会对控件产生任何影响。

PerformClick

System.Windows.Forms.IButtonControl 接口提供模拟单击控件的 PerformClick 方法。 System.Windows.Forms.ButtonSystem.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 SendInputUser32.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

另请参阅