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.
Windows Forms fournit la classe System.Windows.Forms.SendKeys pour envoyer 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 Send
ne le fait pas. Pour plus d’informations sur SendWait
, consultez Pour envoyer une séquence de touches à une autre application.
Attention
Si votre application est destinée à une utilisation internationale avec un large éventail de 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 classe SendKeys utilise la nouvelle implémentation, la méthode SendWait ne bloque plus le thread actuel lors de l’envoi de séquences de touches à une autre application.
Important
Si votre application s’appuie sur un comportement cohérent quel que soit le 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 classe SendKeys à uniquement utiliser l’implémentation précédente, utilisez plutôt la valeur "JournalHook"
.
Appelez la méthode SendKeys.Send ou SendKeys.SendWait de la classe SendKeys. Les séquences de touches spécifiées sont reçues par le contrôle actif de l’application.
L'exemple de code suivant utilise Send
pour simuler l'appui simultané sur les touches ALT et DOWN. Ces séquences de touches entraînent l’affichage de la liste déroulante du contrôle ComboBox. Cet exemple suppose une Form avec un Button et un 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
Les méthodes SendKeys.Send et SendKeys.SendWait 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 plateforme pour appeler les méthodes FindWindow
et SetForegroundWindow
pour activer la fenêtre d’application Calculatrice, puis appelle Send
pour émettre une série de calculs à 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 de 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
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ées dans le modèle de On
suivi de EventName
, comme 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).
Commentaires sur .NET Desktop feedback
.NET Desktop feedback est un projet open source. Sélectionnez un lien pour fournir des commentaires :