Partager via


Comment simuler des événements clavier (Windows Forms .NET)

Windows Forms fournit quelques options pour simuler par programmation l’entrée du clavier. Cet article fournit une vue d’ensemble de ces options.

Utiliser SendKeys

Windows Forms fournit la classe permettant d’envoyer System.Windows.Forms.SendKeys des séquences de touches à l’application active. Il existe deux méthodes pour envoyer des séquences de touches à une application : SendKeys.Send et SendKeys.SendWait. La différence entre les deux méthodes est que SendWait bloque le thread actuel lorsque la séquence de touches est envoyée, en attendant une réponse, tandis que ce n’est pas le cas Send . Pour plus d’informations sur SendWait, consultez Pour envoyer une séquence de touches à une autre application.

Attention

Si votre application est prévue pour une utilisation internationale avec différents claviers, l'utilisation de SendKeys.Send peut produire des résultats imprévisibles et doit être évitée.

En arrière-plan, SendKeys utilise une implémentation Windows plus ancienne pour envoyer des entrées, ce qui peut échouer sur Windows moderne, où il est prévu que l’application ne s’exécute pas avec des droits d’administration. Si l’ancienne implémentation échoue, le code tente automatiquement l’implémentation Windows la plus récente pour l’envoi d’entrée. En outre, lorsque la SendKeys classe utilise la nouvelle implémentation, la SendWait méthode ne bloque plus le thread actuel lors de l’envoi de séquences de touches à une autre application.

Important

Si votre application repose sur un comportement cohérent indépendamment du système d'exploitation, vous pouvez forcer la classe SendKeys à utiliser la nouvelle implémentation en ajoutant le paramètre d'application suivant à votre fichier app.config.

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

Pour forcer la SendKeys classe à utiliser uniquement l’implémentation précédente, utilisez plutôt la valeur "JournalHook" .

Pour envoyer une séquence de touches à la même application

Appelez la méthode SendKeys.Send ou SendKeys.SendWait de la classe SendKeys . Les séquences de touches spécifiées seront reçues par le contrôle actif de l'application.

L’exemple de code suivant utilise Send pour simuler l’appui sur les touches ALT et DOWN ensemble. Ces séquences de touches entraînent l’affichage du ComboBox contrôle dans sa liste déroulante. Cet exemple suppose un Form avec un Button et 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

Pour envoyer une séquence de touches vers une autre application

Les SendKeys.Send méthodes et SendKeys.SendWait les méthodes envoient des séquences de touches à l’application active, qui est généralement l’application à partir de laquelle vous envoyez des séquences de touches. Pour envoyer des séquences de touches à une autre application, vous devez d’abord l’activer. Étant donné qu’il n’existe aucune méthode managée pour activer une autre application, vous devez utiliser des méthodes Windows natives pour concentrer l’autre application. L'exemple de code suivant utilise l'appel de code non managé pour appeler les méthodes FindWindow et SetForegroundWindow pour activer la fenêtre de l'application Calculatrice, puis appelle Send pour émettre une série de calculs vers l'application Calculatrice.

L’exemple de code suivant utilise Send pour simuler l’appui sur les touches dans l’application Calculatrice Windows 10. Il recherche d’abord une fenêtre d’application avec le titre, Calculator puis l’active. Une fois activés, les séquences de touches sont envoyées pour calculer 10 plus 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

Utiliser les méthodes OnEventName

Le moyen le plus simple de simuler des événements de clavier consiste à appeler une méthode sur l’objet qui déclenche l’événement. La plupart des événements ont une méthode correspondante qui les appelle, nommée dans le modèle de On suivi EventName, par exemple OnKeyPress. Cette option n’est possible que dans les contrôles ou formulaires personnalisés, car ces méthodes sont protégées et ne sont pas accessibles en dehors du contexte du contrôle ou du formulaire.

Ces méthodes protégées sont disponibles pour simuler des événements de clavier.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Pour plus d’informations sur ces événements, consultez Utilisation des événements clavier (Windows Forms .NET).

Voir aussi