C# でマウス クリック イベントをシミュレートする

Naila Saad Siddiqui 2023年10月12日
  1. C# でのマウスイベント
  2. C# でマウス イベントをシミュレートする
C# でマウス クリック イベントをシミュレートする

この短い記事は、C# でのマウス クリック イベントのシミュレーションに関するものです。 マウス クリック イベントをシミュレートするために、C# ライブラリで使用できるメソッドのいくつかについて説明します。

マウス イベントのシミュレートとは、マウスの動きを制御したり、マウス クリック イベントをトリガーしたりできるコードを記述することを意味します。これにより、関連するマウス イベント ハンドラーがトリガーされます。 Windows のネイティブ機能を使用してマウスを操作できます (つまり、カーソルの動きとクリックをシミュレートします)。

まず、マウス イベントとは何か、およびこれらを使用してイベントをシミュレートできない理由について説明します。

C# でのマウスイベント

ほとんどのイベントには、これらのイベントが発生したときに特定のコードを実行する対応するハンドラ メソッドがあります。 これらのメソッドは通常、OnMouseMove のように、On の後に EventName が続く形式に従います。

コントロールまたはフォームのコンテキスト外からのアクセスを防止するこれらのメソッドの保護された性質により、このオプションはカスタム コントロールまたはフォーム内でのみ使用できます。

これらのメソッドは単なるイベント ハンドラー (たとえば、OnMouseMove) であり、対応するイベントが発生したときに実行されます。 これらのメソッドはイベントを制御しません。

たとえば、OnMouseMove メソッドはカーソルの動きに対して何らかの処理を行いますが、カーソル自体を制御することはできません。

特定のマウス イベントが発生したときに関連するルーチン/アクションを実行する、使用可能なイベント ハンドラーのリストは次のとおりです。

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

このセクションで説明したように、イベント ハンドラーを使用してイベントをシミュレートすることはできません。 ただし、イベントをシミュレートするために、他のいくつかの OS ネイティブ メソッドを使用できます。

次のセクションでそれらを調べてみましょう。

C# でマウス イベントをシミュレートする

ほとんどのコントロールには、ユーザー コードを実行する ボタン やチェック状態を変更する チェックボックス など、いくつかのクリック関連アクションがあるため、Windows フォームはクリックを開始するための簡単な方法を提供します。 Comboboxes は、クリックしても反応しないタイプのコントロールであり、クリックをシミュレートしてもコントロールには影響しません。

PerformClick() メソッド

Microsoft の System.Windows.Forms.IButtonControlPerformClick メソッドを提供します。これは IButtonControl インターフェイスを通じて利用でき、フォーム コントロールのクリックをシミュレートします。 System.Windows.Forms.Button を含むすべてのコントロールは、このインターフェイスを実装します。

次の例では、Windows フォーム アプリケーションを作成しました。 フォームには 2つのボタンがあります。 最初のボタンをクリックすると、PerformClick メソッドを使用して 2 番目のボタンをクリックすることもできます。

このコーディング例のインターフェースは次のようになります。

performClick インターフェースの例

button1 および button2, という名前のこれらのボタンに対応するハンドラ関数は次のとおりです。

private void button1_Click(object sender, EventArgs e) {
  button2.PerformClick();
}
private void button2_Click(object sender, EventArgs e) {
  MessageBox.Show("Button 2 Clicked!!");
}

上記のコードでは、button1 のイベント ハンドラでメソッド button2.PerformClick() を呼び出していることがわかります。 これにより、button2 のクリック イベント ハンドラーが呼び出され、最終的に button2 のハンドラー関数でコード化されたメッセージ ボックスが表示されます。

PerformClick の出力例

チェックボックスのクリックを呼び出し、マウスの動きを処理する

InvokeOnClick 関数を使用して、フォームのカスタム コントロールでマウス クリックをシミュレートします。 このメソッドは 保護 されており、フォームまたは派生カスタム コントロールでのみ使用できます。

たとえば、以下のコードは、ボタンをクリックするとチェックボックスを選択します。 この例のインターフェイスには、2つのチェックボックスと、それに対応する 2つのボタンが含まれています。

上部の見出しを表示する 1つの label が上部に配置され、button が下部に配置され、マウスの動きをシミュレートします。 このインターフェイスを以下に示します。

InvokeOnClick インターフェイス

2つのボタンのイベント ハンドラー関数は次のようになります。

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

カーソルを移動するネイティブ Windows メソッド

Windows オペレーティング システムには、マウスの動きとキーボード イベントを制御するネイティブ メソッドがいくつか用意されています。 この例では、マウスの動きを制御し、カーソル位置を変更する機能のみを説明し、実演します。

上の例では、下部にある機能しないボタンにClick me to Move Mouse Pointer to Headingと表示されています。 このボタンは、カーソル位置を一番上の見出しに向かって移動するために追加されています: Mouse Simulation Demo

このボタンを機能させましょう。

user32.dllSetCursorPos API を提供し、名前空間 System.Runtime.InteropServices で定義されています。 このメソッドは、ネイティブ Windows プロシージャを呼び出すため、外部メソッドとして定義する必要があります。

次のコードは、カーソル位置を設定します。

[DllImport("user32.dll", EntryPoint = "SetCursorPos")]
[return:MarshalAs(UnmanagedType.Bool)]
private static extern bool SetCursorPos(int x, int y);

private void button3_Click(object sender, EventArgs e) {
  Point position = PointToScreen(label1.Location) + new Size(label1.Width / 2, label1.Height / 2);
  SetCursorPos(position.X, position.Y);
}

Point オブジェクトを作成して上部のラベルの位置を取得し、ポイントを追加してラベルの中間点を取得し、その座標を SetCursorPos 関数に渡しました。

この例の完全なコードは次のようになります。

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WinFormsApp2 {
  public partial class Form1 : Form {
    [DllImport("user32.dll", EntryPoint = "SetCursorPos")]
    [return:MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetCursorPos(int x, int y);
    public Form1() {
      InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e) {
      InvokeOnClick(checkBox1, EventArgs.Empty);
    }
    private void button2_Click(object sender, EventArgs e) {
      InvokeOnClick(checkBox2, EventArgs.Empty);
    }

    private void button3_Click(object sender, EventArgs e) {
      Point position =
          PointToScreen(label1.Location) + new Size(label1.Width / 2, label1.Height / 2);
      SetCursorPos(position.X, position.Y);
    }
  }
}

このマウス シミュレーションの出力は、次の図に示されています。

マウス シミュレーションの出力

関連記事 - Csharp Mouse