Comment puis-je créer par programme un événement qui simulerait une touche appuyée sur le clavier?
la source
Comment puis-je créer par programme un événement qui simulerait une touche appuyée sur le 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 Insert key KeyDown à l'élément actuellement sélectionné:
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 ni sur des composants internes de Windows et devrait être beaucoup plus fiable que les autres. Il vous permet également de simuler une pression de touche sur un élément spécifique.
Notez que ce code s'applique uniquement aux événements PreviewKeyDown, KeyDown, PreviewKeyUp et KeyUp. Si vous souhaitez 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 des événements d'aperçu, par exemple, PreviewKeyDown doit précéder KeyDown
L'utilisation de 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 vous voulez. D'un autre côté, si vous faites vraiment quoi simuler des touches de clavier réelles pour une raison quelconque, vous utiliserez plutôt InputManager.ProcessInput ().
Ctrl+C
)
Pour produire des événements clés sans 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 déroulement de votre programme, utilisez Envoyer. Pour attendre les processus démarrés par la frappe, utilisez SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft a d'autres 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 cela avec les réponses suggérées, je suis tombé sur ce projet codeplex Windows Input Simulator qui simplifiait la simulation d'une pression sur une touche:
Installez le package, peut être fait ou à partir du gestionnaire de packages NuGet ou de la console du gestionnaire de packages comme:
Install-Package InputSimulator
Utilisez ces 2 lignes de code:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
Et c'est tout!
-------ÉDITER--------
La page du projet sur CodePlex est marqué pour une raison quelconque, c'est le lien vers la galerie NuGet.
API Windows SendMessage avec send WM_KEYDOWN .