閱讀英文版本

分享方式:


如何模擬滑鼠事件 (Windows Forms .NET)

模擬 Windows Forms 中的滑鼠事件並不像模擬鍵盤事件那麼直接。 Windows Forms 未提供協助程式類別來移動滑鼠並叫用按一下滑鼠動作。 控制滑鼠的唯一選項是使用原生 Windows 方法。 如果您正在使用自訂控制項或表單,則可以模擬滑鼠事件,但無法直接控制滑鼠。

事件

大部分事件都有叫用它們的對應方法,其名稱為 On 模式,後面接著 EventName,例如 OnMouseMove。 通常只有在自訂控制項和表單內才能使用這個選項,因為這些方法受到保護,無法從控制項或表單的内容外存取。 使用 OnMouseMove 之類方法的缺點是它實際上不會控制滑鼠或與控制項互動,而只會引發相關聯的事件。 例如,如果您想要模擬將滑鼠停留在 ListBox 中的項目上,OnMouseMoveListBox 不會以可視化方式回應游標下反白顯示的項目。

這些受保護的方法可用來模擬鍵盤事件。

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

如需這些事件的詳細資訊,請參閱使用滑鼠事件 (Windows Forms .NET)

叫用按一下

考慮到大部分控制項會在按一下時執行某些動作,例如呼叫使用者程式碼的按鈕,或核取方塊會變更其核取狀態,Windows Forms 提供簡單的方法來觸發按一下。 某些控制項,例如下拉式方塊,在按一下時不會執行任何動作,而模擬按一下時對控制項沒有效果。

PerformClick

System.Windows.Forms.IButtonControl 介面提供 PerformClick 方法,其會模擬在控制項上按一下。 System.Windows.Forms.ButtonSystem.Windows.Forms.LinkLabel 控制項都會實作此介面。

C#
button1.PerformClick();

InvokeClick

使用表單或自訂控制項時,請使用 InvokeOnClick 方法來模擬滑鼠按一下。 這是受保護的方法,只能從表單或衍生的自訂控制項內呼叫。

例如,下列程式碼會從 button1 按一下核取方塊。

C#
private void button1_Click(object sender, EventArgs e)
{
    InvokeOnClick(checkBox1, EventArgs.Empty);
}

使用原生 Windows 方法

Windows 提供方法可供您呼叫來模擬滑鼠移動和點按,例如 User32.dll SendInputUser32.dll SetCursorPos。 下列範例會將滑鼠游標移至控制項的中心:

C#
[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);
}

另請參閱