キーボード イベントをシミュレートする方法 (Windows フォーム .NET)

Windows フォームには、プログラムでキーボード入力をシミュレートするためのいくつかのオプションが用意されています。 この記事では、これらのオプションの概要について説明します。

重要

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

SendKeys を使用する

Windows フォームには、アクティブなアプリケーションにキーストロークを送信するための System.Windows.Forms.SendKeys クラスが用意されています。 アプリケーションにキーストロークを送信するには、SendKeys.SendSendKeys.SendWait の 2 つのメソッドがあります。 2 つのメソッドの違いは、SendWait がキーストロークが送信されたときに現在のスレッドをブロックして、応答を待機するのに対し、Send はそれを行わないことです。 SendWait の詳細については、「別のアプリケーションにキーストロークを送信するには」を参照してください。

注意事項

アプリケーションが国際対応し、さまざまなキーボードの使用を想定している場合は、 SendKeys.Send の使用により予期しない結果になる可能性があるため、回避する必要があります。

バックグラウンドで、SendKeys は古い Windows 実装を使用して入力を送信します。これは、アプリケーションが管理者権限で実行されていないことが予想される最新の Windows では失敗する可能性があります。 古い実装が失敗した場合、コードによって自動的に新しい Windows の実装で入力の送信が試行されます。 さらに、SendKeys クラスで新しい実装を使用すると、キーストロークを別のアプリケーションに送信するときに、SendWait メソッドで現在のスレッドがブロックされなくなります。

重要

アプリケーションが、オペレーティング システムに関係なく一貫した動作に依存する場合、app.config ファイルに次のアプリケーション設定を追加することで、 SendKeys クラスが新しい実装を使用するよう強制することができます。

<appSettings>
  <add key="SendKeys" value="SendInput"/>
</appSettings>

SendKeys クラスで前の実装 "のみ" を使用するよう強制するには、代わりに値 "JournalHook" を使用します。

同じアプリケーションにキーストロークを送信するには

SendKeys.Send クラスの SendKeys.SendWait メソッドまたは SendKeys メソッドを呼び出します。 指定されたキーストロークは、アプリケーションのアクティブなコントロールによって受信されます。

次のコード例では、Send を使用して、ALT下方向 キーを一緒に押すことをシミュレートします。 これらのキーストロークによって、ComboBox コントロールのドロップダウンが表示されます。 この例では、ButtonComboBox がある Form を想定しています。

private void button1_Click(object sender, EventArgs e)
{
    comboBox1.Focus();
    SendKeys.Send("%+{DOWN}");
}
Private Sub Button1_Click(sender As Object, e As EventArgs)
    ComboBox1.Focus()
    SendKeys.Send("%+{DOWN}")
End Sub

別のアプリケーションにキーストロークを送信するには

SendKeys.SendSendKeys.SendWait のメソッドは、アクティブなアプリケーション (通常はキーストロークの送信元のアプリケーション) にキーストロークを送信します。 キーストロークを別のアプリケーションに送信するには、まず、それをアクティブ化する必要があります。 別のアプリケーションをアクティブ化するマネージド メソッドがないため、ネイティブ Windows メソッドを使用して他のアプリケーションにフォーカスを設定する必要があります。 次のコード例は、プラットフォーム呼び出しを使用して FindWindow メソッドと SetForegroundWindow メソッドを呼び出し、電卓アプリケーションのウィンドウをアクティブ化してから、 Send を呼び出して電卓アプリケーションに一連の計算を発行します。

次のコード例では、Send を使用して、Windows 10 電卓アプリケーションでのキーの押下をシミュレートします。 まず、Calculator というタイトルのアプリケーション ウィンドウを検索し、アクティブ化します。 アクティブ化したら、10 + 10 を計算するキーストロークが送信されます。

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

private void button1_Click(object sender, EventArgs e)
{
    IntPtr calcWindow = FindWindow(null, "Calculator");

    if (SetForegroundWindow(calcWindow))
        SendKeys.Send("10{+}10=");
}
<Runtime.InteropServices.DllImport("USER32.DLL", CharSet:=Runtime.InteropServices.CharSet.Unicode)>
Public Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr : End Function

<Runtime.InteropServices.DllImport("USER32.DLL")>
Public Shared Function SetForegroundWindow(hWnd As IntPtr) As Boolean : End Function

Private Sub Button1_Click(sender As Object, e As EventArgs)
    Dim hCalcWindow As IntPtr = FindWindow(Nothing, "Calculator")

    If SetForegroundWindow(hCalcWindow) Then
        SendKeys.Send("10{+}10=")
    End If
End Sub

OnEventName メソッドを使用する

キーボード イベントをシミュレートする最も簡単な方法は、イベントを発生させるオブジェクトでメソッドを呼び出すことです。 ほとんどのイベントには、それらを呼び出す対応するメソッドがあり、OnKeyPress のように On の後に EventName が続く名前が付けられています。 これらのメソッドは保護されており、コントロールまたはフォームのコンテキストの外部からアクセスすることはできないため、このオプションは、カスタム コントロールまたはフォーム内でのみ使用できます。

これらの保護されたメソッドは、キーボード イベントをシミュレートするために使用できます。

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

これらのイベントの詳細については、「キーボード イベントの使用 (Windows フォーム .NET)」を参照してください。

関連項目