Windows フォームには、キーボード入力をプログラムでシミュレートするためのオプションがいくつか用意されています。 この記事では、これらのオプションの概要について説明します。
SendKeys を使用する
Windows フォームには、アクティブなアプリケーションにキーストロークを送信するための System.Windows.Forms.SendKeys クラスが用意されています。 アプリケーションにキーストロークを送信するには、SendKeys.Send と SendKeys.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 コントロールにドロップダウンが表示されます。 この例では、Form と Buttonを持つ ComboBox を想定しています。
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.Send メソッドと SendKeys.SendWait メソッドは、アクティブなアプリケーション (通常、キーストロークを送信するアプリケーション) にキーストロークを送信します。 キーストロークを別のアプリケーションに送信するには、最初にアクティブ化する必要があります。 別のアプリケーションをアクティブ化するためのマネージド メソッドがないため、ネイティブ Windows メソッドを使用して他のアプリケーションに集中する必要があります。 次のコード例では、プラットフォーム呼び出しを使用して FindWindow
メソッドと SetForegroundWindow
メソッドを呼び出して Calculator アプリケーション ウィンドウをアクティブ化し、Send
を呼び出して電卓アプリケーションに一連の計算を発行します。
次のコード例では、 Send
を使用して、Windows 電卓アプリケーションにキーを押す操作をシミュレートします。 最初に、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 メソッドを使用する
キーボード イベントをシミュレートする最も簡単な方法は、イベントを発生させるオブジェクトに対してメソッドを呼び出す方法です。 ほとんどのイベントには、それらを呼び出す対応するメソッドがあり、On
のパターンで名前が付けられ、その後に EventName
などの OnKeyPress
が続きます。 これらのメソッドは保護されており、コントロールまたはフォームのコンテキストの外部からアクセスできないため、このオプションはカスタム コントロールまたはフォーム内でのみ可能です。
これらの保護されたメソッドは、キーボード イベントをシミュレートするために使用できます。
OnKeyDown
OnKeyPress
OnKeyUp
これらのイベントの詳細については、「 キーボード イベントの使用」を参照してください。
こちらも参照ください
.NET Desktop feedback