Simulieren von Tastaturereignissen (Windows Forms .NET)

Windows Forms stellt einige Optionen zur programmgesteuerten Simulation von Tastatureingaben bereit. Dieser Artikel bietet eine Übersicht über diese Optionen.

Wichtig

Der Desktopleitfaden zu .NET 7 und .NET 6 ist in Bearbeitung.

Verwenden von SendKeys

Windows Forms stellt die System.Windows.Forms.SendKeys-Klasse bereit, um Tastatureingaben an die aktive Anwendung zu senden. Es gibt zwei Methoden zum Senden von Tastatureingaben an eine Anwendung: SendKeys.Send und SendKeys.SendWait. Der Unterschied zwischen den beiden Methoden besteht darin, dass SendWait im Gegensatz zu Send den aktuellen Thread blockiert, wenn die Tastatureingabe gesendet wird, und dann auf eine Antwort wartet. Weitere Informationen zu SendWait finden Sie unter Senden einer Tastatureingabe an eine andere Anwendung.

Achtung

Wenn Ihre Anwendung für internationale Verwendung mit unterschiedlichen Tastaturen vorgesehen ist, kann ein Verwenden von SendKeys.Send zu unvorhersehbaren Ergebnissen führen und sollte vermieden werden.

Im Hintergrund verwendet SendKeys eine ältere Windows-Implementierung zum Senden von Eingaben, bei der im Zusammenhang mit modernen Windows-Betriebssystemen möglicherweise ein Fehler auftritt, da hier erwartet wird, dass die Anwendung nicht mit Administratorrechten ausgeführt wird. Wenn bei der älteren Implementierung ein Fehler auftritt, versucht der Code automatisch, die neuere Windows-Implementierung zum Senden von Eingaben zu verwenden. Wenn die SendKeys-Klasse die neue Implementierung verwendet, blockiert die SendWait-Methode zudem den aktuellen Thread nicht mehr, wenn Tastatureingaben an eine andere Anwendung gesendet werden.

Wichtig

Ist für Ihre Anwendung ein einheitliches, vom Betriebssystem unabhängiges Verhalten erforderlich, können Sie für die SendKeys -Klasse das Verwenden der neuen Implementierung erzwingen, indem Sie die folgende Anwendungseinstellung in Ihre "app.config"-Datei einfügen.

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

Verwenden Sie stattdessen den Wert "JournalHook", wenn die SendKeys-Klasse gezwungen werden soll, nur die vorherige Implementierung zu nutzen.

So senden Sie eine Tastatureingabe an dieselbe Anwendung

Rufen Sie die SendKeys.Send - oder die SendKeys.SendWait -Methode der SendKeys -Klasse auf. Die angegebenen Tastatureingaben werden vom aktiven Steuerelement der Anwendung empfangen.

Im folgenden Codebeispiel wird Send verwendet, um das gleichzeitige Drücken der Tasten ALT und NACH-UNTEN zu simulieren. Diese Tastatureingaben bewirken, dass das ComboBox-Steuerelement sein Dropdownmenü anzeigt. In diesem Beispiel wird eine Form-Klasse mit einer Button- und einer ComboBox-Klasse vorausgesetzt.

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

So senden Sie eine Tastatureingabe an eine andere Anwendung

Die Methoden SendKeys.Send und SendKeys.SendWait senden Tastatureingaben an die aktive Anwendung, bei der es sich normalerweise um die Anwendung handelt, über die Sie Tastatureingaben senden. Sie müssen eine andere Anwendung zuerst aktivieren, um Tastatureingaben an diese senden zu können. Da keine verwaltete Methode zum Aktivieren einer anderen Anwendung vorhanden ist, müssen Sie native Windows-Methoden verwenden, um den Fokus auf die andere Anwendung zu lenken. Im folgenden Codebeispiel wird ein Plattformaufruf dazu verwendet, die Methoden FindWindow und SetForegroundWindow aufzurufen, um das Anwendungsfenster Rechner zu aktivieren, und dann wird Send aufgerufen, um einige Berechnungselemente an Rechner zu senden.

Im folgenden Codebeispiel wird Send verwendet, um das Drücken von Tasten in der Rechneranwendung unter Windows 10 zu simulieren. Zuerst wird nach einem Anwendungsfenster mit dem Titel Calculator gesucht und dieses dann aktiviert. Nach der Aktivierung werden Tastatureingaben zum Berechnen der Summe von „10“ und „10“ gesendet.

[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

Verwenden von OnEventName-Methoden

Die einfachste Möglichkeit zum Simulieren von Tastaturereignissen besteht darin, eine Methode für das Objekt aufzurufen, das das Ereignis auslöst. Die meisten Ereignisse verfügen über eine entsprechende Methode, die sie aufruft und im Muster On gefolgt von EventName (z. B. OnKeyPress) benannt wird. Diese Option wird normalerweise nur in benutzerdefinierten Steuerelementen und Formularen unterstützt, weil die Methoden geschützt sind und außerhalb des Kontexts des Steuerelements oder Formulars nicht aufgerufen werden können.

Diese geschützten Methoden sind zum Simulieren von Tastaturereignissen verfügbar.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Weitere Informationen zu diesen Ereignissen finden Sie unter Verwenden von Tastaturereignissen (Windows Forms .NET).

Siehe auch