マウス イベントをシミュレートする方法 (Windows フォーム .NET)

Windows フォームでのマウス イベントのシミュレートは、キーボード イベントをシミュレートするほど簡単ではありません。 Windows フォームには、マウスを移動してマウスクリックのアクションを呼び出すヘルパー クラスがありません。 マウスは、Windows のネイティブ メソッドを使用してのみ制御することができます。 カスタム コントロールまたはフォームを使用している場合は、マウス イベントをシミュレートできますが、マウスを直接制御することはできません。

重要

.NET 7 と .NET 6 用のデスクトップ ガイド ドキュメントは作成中です。

イベント

ほとんどのイベントには、それらを呼び出す対応するメソッドがあり、OnMouseMove のように On の後に EventName が続く名前が付けられています。 これらのメソッドは保護されており、コントロールまたはフォームのコンテキストの外部からアクセスすることはできないため、このオプションは、カスタム コントロールまたはフォーム内でのみ使用できます。 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

関連項目