Comment créer par programme un événement simulant une pression sur une touche du clavier?
La question est étiquetée WPF mais les réponses à ce jour sont spécifiques à WinForms et Win32.
Pour ce faire dans WPF, créez simplement un KeyEventArgs et appelez RaiseEvent sur la cible. Par exemple, pour envoyer un événement KeyDown Insertion de clé à l’élément actuellement ciblé:
var key = Key.Insert; // Key to send
var target = Keyboard.FocusedElement; // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send
target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(target),
0,
key)
{ RoutedEvent=routedEvent }
);
Cette solution ne repose ni sur les appels natifs ni sur les internes de Windows et devrait être beaucoup plus fiable que les autres. Il vous permet également de simuler une pression sur un élément spécifique.
Notez que ce code est uniquement applicable aux événements PreviewKeyDown, KeyDown, PreviewKeyUp et KeyUp. Si vous souhaitez envoyer des événements TextInput, procédez comme suit:
var text = "Hello";
var target = Keyboard.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;
target.RaiseEvent(
new TextCompositionEventArgs(
InputManager.Current.PrimaryKeyboardDevice,
new TextComposition(InputManager.Current, target, text))
{ RoutedEvent = routedEvent }
);
Notez également que:
Les contrôles s’attendent à recevoir des événements Preview, par exemple PreviewKeyDown doit précéder KeyDown
Utiliser target.RaiseEvent (...) envoie l'événement directement à la cible sans méta-traitement, tel que les accélérateurs, la composition de texte et l'IME. C'est normalement ce que tu veux. D'autre part, si vous faites vraiment quoi simuler les touches réelles du clavier pour une raison quelconque, utilisez plutôt InputManager.ProcessInput ().
Pour produire des événements clés sans le contexte Windows Forms, nous pouvons utiliser la méthode suivante,
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
un exemple de code est donné ci-dessous:
const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28; //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
//Press the key
keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
return 0;
}
La liste des clés virtuelles est définie ici .
Pour obtenir une image complète, veuillez utiliser le lien ci-dessous, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
Je ne l'ai pas utilisé, mais SendKeys peut faire ce que vous voulez.
Utilisez SendKeys pour envoyer des frappes et des combinaisons de touches à l'application active. Cette classe ne peut pas être instanciée. Pour envoyer une frappe à une classe et poursuivre immédiatement le flux de votre programme, utilisez Envoyer. Pour attendre tout processus lancé par la frappe, utilisez SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft a encore quelques exemples d'utilisation ici .
Facilement! (parce que quelqu'un d'autre a déjà fait le travail pour nous ...)
Après avoir passé beaucoup de temps à essayer ceci avec les réponses suggérées, je suis tombé sur ce projet codeplex Windows Input Simulator qui simplifiait la simulation d'une frappe:
Installez le paquet, vous pouvez le faire depuis le gestionnaire de paquets NuGet ou depuis la console du gestionnaire de paquets, par exemple:
InputSimulator du paquet d'installation
Utilisez ces 2 lignes de code:
inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
Et c'est tout!
Windows API SendMessage avec send WM_KEYDOWN .