¿Cómo puedo generar eventos de pulsación de teclas mediante progtwigción en C #?

¿Cómo puedo crear un evento mediante progtwigción que simule una tecla presionada en el teclado?

La pregunta está etiquetada como WPF, pero las respuestas hasta ahora son WinForms y Win32 específicos.

Para hacer esto en WPF, simplemente construye KeyEventArgs y llama a RaiseEvent en el objective. Por ejemplo, para enviar un evento KeyDown de clave de inserción al elemento actualmente enfocado:

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

Esta solución no se basa en llamadas nativas o internas de Windows y debería ser mucho más confiable que las otras. También le permite simular una pulsación de tecla en un elemento específico.

Tenga en cuenta que este código solo se aplica a los eventos PreviewKeyDown, KeyDown, PreviewKeyUp y KeyUp. Si desea enviar eventos TextInput, lo hará en su lugar:

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

También tenga en cuenta que:

  • Los controles esperan recibir eventos de vista previa, por ejemplo, PreviewKeyDown debe preceder KeyDown

  • El uso de target.RaiseEvent (…) envía el evento directamente al objective sin metaprocesamiento, como aceleradores, composición de texto e IME. Esto es normalmente lo que quieres. Por otro lado, si realmente hace qué simular las teclas del teclado reales por algún motivo, en su lugar usaría InputManager.ProcessInput ().

Para producir eventos clave sin el contexto de Windows Forms, podemos usar el siguiente método,

 [DllImport("user32.dll")] public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); 

El código de muestra se proporciona a continuación:

 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 lista de llaves virtuales se define aquí .

Para obtener una imagen completa, utilice el siguiente enlace, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html

No lo he usado, pero SendKeys puede hacer lo que quieras.

Use SendKeys para enviar combinaciones de teclas y combinaciones de teclas a la aplicación activa. Esta clase no puede ser instanciada. Para enviar una pulsación de tecla a una clase e inmediatamente continuar con el flujo de su progtwig, use Enviar. Para esperar cualquier proceso iniciado con la pulsación de tecla, use SendWait.

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

Microsoft tiene algunos ejemplos más de uso aquí .

¡Fácilmente! (porque alguien más ya hizo el trabajo por nosotros …)

Después de pasar mucho tiempo intentando esto con las respuestas sugeridas, me encontré con este proyecto codeplex Windows Input Simulator que simplificó la simulación de una pulsación de tecla:

  1. Instale el paquete, puede hacerlo desde el administrador de paquetes NuGet o desde la consola del administrador de paquetes, como:

    InstallSimulator InputSimulator

  2. Usa estas 2 líneas de código:

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

¡Y eso es!

API SendMessage de Windows con enviar WM_KEYDOWN .