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.IButtonControl
は PerformClick
メソッドを提供します。これは IButtonControl
インターフェイスを通じて利用でき、フォーム コントロールのクリックをシミュレートします。 System.Windows.Forms.Button
を含むすべてのコントロールは、このインターフェイスを実装します。
次の例では、Windows フォーム アプリケーションを作成しました。 フォームには 2つのボタンがあります。 最初のボタンをクリックすると、PerformClick
メソッドを使用して 2 番目のボタンをクリックすることもできます。
このコーディング例のインターフェースは次のようになります。
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
のハンドラー関数でコード化されたメッセージ ボックスが表示されます。
チェックボックスのクリックを呼び出し、マウスの動きを処理する
InvokeOnClick
関数を使用して、フォームのカスタム コントロールでマウス クリックをシミュレートします。 このメソッドは 保護
されており、フォームまたは派生カスタム コントロールでのみ使用できます。
たとえば、以下のコードは、ボタンをクリックするとチェックボックスを選択します。 この例のインターフェイスには、2つのチェックボックスと、それに対応する 2つのボタンが含まれています。
上部の見出しを表示する 1つの label
が上部に配置され、button
が下部に配置され、マウスの動きをシミュレートします。 このインターフェイスを以下に示します。
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.dll
は SetCursorPos
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);
}
}
}
このマウス シミュレーションの出力は、次の図に示されています。