122 votes

Comment puis-je générer par programme des événements keypress en c# ?

Comment créer par programme un événement qui simulerait une touche sur le clavier ?

162voto

Ray Burns Points 38537

La question est balisé WPF, mais les réponses sont spécifiques WinForms et Win32.

Pour ce faire, dans WPF, il suffit de construire un KeyEventArgs et appel RaiseEvent sur la cible. Par exemple, pour envoyer une Insérez la clé de l'événement KeyDown pour la concentre actuellement sur l'élément:

  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 les appels natifs ou Windows internals et devrait être beaucoup plus fiable que les autres. Il permet aussi de simuler une pression de touche sur un élément spécifique.

Notez que ce code n'est applicable qu'à PreviewKeyDown, KeyDown, PreviewKeyUp, et KeyUp événements. Si vous souhaitez envoyer TextInput événements que vous allez faire ceci à 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'attendre à recevoir de l'Aperçu événements, par exemple PreviewKeyDown devrait précéder KeyDown

  • À l'aide de la cible.RaiseEvent(...) envoie l'événement directement à la cible sans méta-traitement, telles que les accélérateurs, la composition du texte et IME. C'est normalement ce que vous voulez. D'autre part, si vous avez vraiment de ce qui pour simuler le réel touches du clavier pour une raison quelconque, vous devez utiliser InputManager.ProcessInput() à la place.

37voto

Rajesh Points 608

Pour produire les principaux événements 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);

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; 

   }

Liste des Touches 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

24voto

Michael Petrotta Points 35647

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

Utiliser SendKeys pour envoyer des séquences de touches et les combinaisons de touches à l'actif application. Cette classe ne peut pas être instanciée. Pour envoyer une séquence de touches à un classe et poursuivre immédiatement avec le flux de votre programme, utilisez l'option Envoyer. Pour attendre pour tout processus a commencé par l' touches, utilisez SendWait.

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

Microsoft a d'autres exemples d'utilisation ici.

7voto

np-hard Points 2328

Windows API SendMessage avec envoi WM_KEYDOWN.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X