如何模擬滑鼠事件 (Windows Forms .NET)
模擬 Windows Forms 中的滑鼠事件並不像模擬鍵盤事件那麼直接。 Windows Forms 未提供協助程式類別來移動滑鼠並叫用按一下滑鼠動作。 控制滑鼠的唯一選項是使用原生 Windows 方法。 如果您正在使用自訂控制項或表單,則可以模擬滑鼠事件,但無法直接控制滑鼠。
事件
大部分事件都有叫用它們的對應方法,其名稱為 On
模式,後面接著 EventName
,例如 OnMouseMove
。 通常只有在自訂控制項和表單內才能使用這個選項,因為這些方法受到保護,無法從控制項或表單的内容外存取。 使用 OnMouseMove
之類方法的缺點是它實際上不會控制滑鼠或與控制項互動,而只會引發相關聯的事件。 例如,如果您想要模擬將滑鼠停留在 ListBox 中的項目上,OnMouseMove
和 ListBox
不會以可視化方式回應游標下反白顯示的項目。
這些受保護的方法可用來模擬鍵盤事件。
OnMouseDown
OnMouseEnter
OnMouseHover
OnMouseLeave
OnMouseMove
OnMouseUp
OnMouseWheel
OnMouseClick
OnMouseDoubleClick
如需這些事件的詳細資訊,請參閱使用滑鼠事件 (Windows Forms .NET)
叫用按一下
考慮到大部分控制項會在按一下時執行某些動作,例如呼叫使用者程式碼的按鈕,或核取方塊會變更其核取狀態,Windows Forms 提供簡單的方法來觸發按一下。 某些控制項,例如下拉式方塊,在按一下時不會執行任何動作,而模擬按一下時對控制項沒有效果。
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