Comment puis-je programmer la génération d'évènements keypress en C#?

Comment puis-je programmer un événement qui simule qu'une touche est pressée sur le clavier?

101
demandé sur Dave Clemmer 2009-10-29 21:53:33

5 réponses

la question est étiquetée WPF mais les réponses jusqu'à présent sont WinForms spécifiques et Win32.

pour ce faire dans WPF, il suffit de construire un porte-clés et appeler RaiseEvent sur la cible. Par exemple, pour envoyer un Insert KeyDown événement à l'élément focalisé actuellement:

  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 pas sur des appels natifs ou des fenêtres internes et devrait être beaucoup plus fiable que les autres. Il vous permet également de simuler une élément spécifique.

notez que ce code ne s'applique qu'aux événements PreviewKeyDown, KeyDown, PreviewKeyUp et KeyUp. Si vous voulez envoyer des événements TextInput, vous le ferez à la place:

  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 un aperçu événements, par exemple PreviewKeyDown doit précéder le KeyDown

  • utilisant target.RaiseEvent(...) envoie l'événement directement à la cible sans méta-traitement tel que accélérateurs, composition de textes et IME. C'est normalement ce que vous voulez. D'un autre côté, si vous le faites vraiment que simuler des touches de clavier réelles? pour une raison quelconque, vous devez utiliser InputManager.ProcessInput () à la place.

138
répondu Ray Burns 2013-05-20 15:48:43

pour produire des événements clés Sans Windows Forms contexte, Nous pouvons utiliser la méthode suivante,

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
Le code d'échantillon

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;
}

liste des clés virtuelles sont définis ici .

Pour obtenir l'image complète, veuillez utiliser le lien ci-dessous, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html

23
répondu Rajesh 2017-04-13 22:38:54

je ne l'ai pas utilisé, mais SendKeys peut faire ce que vous voulez.

utilisez SendKeys pour envoyer des touches et les combinaisons de touches à l'actif application. Cette classe ne peut pas être instancier. Pour envoyer une frappe à un classe et poursuivre immédiatement avec le flux de votre programme, utilisez l'option Envoyer. De attendre les processus entamés par le frappe, utilise SendWait.

System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");

Microsoft a quelques autres exemples d'utilisation ici .

22
répondu Michael Petrotta 2009-10-29 19:14:04

facilement! (parce que quelqu'un d'autre a déjà fait le travail pour nous...)

après avoir passé beaucoup de temps à essayer avec les réponses suggérées, je suis tombé sur ce projet codeplex Windows Input Simulator qui a rendu simple comme peut l'être de simuler une presse à clé:

  1. installez le paquet, peut être fait ou à partir du Gestionnaire de paquets NuGet ou à partir de la console du gestionnaire de paquets comme:

    Install-Package InputSimulator

  2. utilisez ces 2 lignes de code:

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

et c'est tout!

8
répondu Ravid Goldenberg 2016-05-04 13:20:04
7
répondu np-hard 2010-02-14 02:09:27