Comment créer par programme un événement qui simulerait une touche sur le clavier ?
Réponses
Trop de publicités?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.
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
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.
Windows API SendMessage avec envoi WM_KEYDOWN.