Freigeben über


Simulieren von Tastaturereignissen

Windows Forms bietet einige Optionen zum programmgesteuerten Simulieren der Tastatureingabe. Dieser Artikel enthält eine Übersicht über diese Optionen.

Verwenden von SendKeys

Windows Forms stellt die System.Windows.Forms.SendKeys Klasse zum Senden von Tastaturanschlägen an die aktive Anwendung bereit. Es gibt zwei Methoden, Tastenanschläge an eine Anwendung zu senden: SendKeys.Send und SendKeys.SendWait. Der Unterschied zwischen den beiden Methoden besteht darin, dass SendWait den aktuellen Thread blockiert, wenn der Tastaturanschlag gesendet wird und auf eine Antwort wartet, während Send nicht. Weitere Informationen zu SendWaitfinden Sie unter . Um einen Tastenanschlag an eine andere Anwendung zu senden, verwenden Sie.

Vorsicht

Wenn Ihre Anwendung für die internationale Verwendung mit verschiedenen Tastaturen vorgesehen ist, kann die Verwendung von SendKeys.Send unvorhersehbaren Ergebnissen führen und sollten vermieden werden.

Im Hintergrund verwendet SendKeys eine ältere Windows-Implementierung für die Eingabeverarbeitung, was auf Systemen fehlschlagen kann, bei denen erwartet wird, dass die Anwendung ohne Administratorrechte ausgeführt wird. Wenn die ältere Implementierung fehlschlägt, versucht der Code automatisch die neuere Windows-Implementierung zum Senden von Eingaben. Wenn die SendKeys Klasse die neue Implementierung verwendet, blockiert die SendWait-Methode den aktuellen Thread beim Senden von Tastaturanschlägen an eine andere Anwendung nicht mehr.

Von Bedeutung

Wenn Ihre Anwendung unabhängig vom Betriebssystem auf ein einheitliches Verhalten angewiesen ist, können Sie die SendKeys Klasse erzwingen, die neue Implementierung zu verwenden, indem Sie der app.config Datei die folgende Anwendungseinstellung hinzufügen.

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

Verwenden Sie stattdessen den Wert SendKeys, wenn die -Klasse gezwungen werden soll, "JournalHook" 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 Tastenanschläge werden vom aktiven Steuerelement der Anwendung empfangen.

Im folgenden Codebeispiel wird Send das gleichzeitige Drücken der Alt- und der Nach-unten-Taste simuliert. Diese Tastaturanschläge 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 einen Tastaturanschlag an eine andere Anwendung

Die methoden SendKeys.Send und SendKeys.SendWait senden Tastaturanschläge an die aktive Anwendung, bei der es sich in der Regel um die Anwendung handelt, aus der Sie Tastaturanschläge senden. Um Tastaturanschläge an eine andere Anwendung zu senden, müssen Sie sie zuerst aktivieren. Da es keine verwaltete Methode zum Aktivieren einer anderen Anwendung gibt, müssen Sie systemeigene Windows-Methoden verwenden, um die andere Anwendung zu konzentrieren. Im folgenden Codebeispiel wird Platform Invoke verwendet, um die FindWindow- und SetForegroundWindow-Methoden aufzurufen, um das Fenster der Rechner-Anwendung zu aktivieren, und ruft dann Send auf, um eine Reihe von Berechnungen an die Rechner-Anwendung zu übermitteln.

Das folgende Codebeispiel verwendet Send, um das Drücken von Tasten in der Windows-Rechneranwendung zu simulieren. Zuerst sucht es nach einem Anwendungsfenster mit dem Titel Calculator und aktiviert es dann. Nach der Aktivierung werden Tastaturanschläge 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 Sie 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, die im Muster von On gefolgt von EventNamebenannt wird, z. B. OnKeyPress. Diese Option ist nur in benutzerdefinierten Steuerelementen oder Formularen möglich, da diese Methoden geschützt sind und nicht außerhalb des Kontexts des Steuerelements oder Formulars zugegriffen werden kann.

Diese geschützten Methoden stehen zur Verfügung, um Tastaturereignisse zu simulieren.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Weitere Informationen zu diesen Ereignissen finden Sie unter Tastaturereignisse verwenden.

Siehe auch