web-dev-qa-db-fra.com

Comment générer par programme des événements de pression de touche en C #?

Comment créer par programme un événement simulant une pression sur une touche du clavier?

103
Dan Vogel

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 ().

141
Ray Burns

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

26
Rajesh

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 .

22
Michael Petrotta

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:

  1. 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

  2. Utilisez ces 2 lignes de code:

    inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)

Et c'est tout!

10

Windows API SendMessage avec send WM_KEYDOWN .

7
np-hard