¿Cómo puedo crear mediante programación un evento que simule una tecla presionada en el teclado?
¿Cómo puedo crear mediante programación un evento que simule una tecla presionada en el teclado?
Respuestas:
La pregunta está etiquetada como WPF, pero las respuestas hasta ahora son específicas de WinForms y Win32.
Para hacer esto en WPF, simplemente construya un KeyEventArgs y llame a RaiseEvent en el destino. Por ejemplo, para enviar un evento Insertar clave KeyDown 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 internos de Windows y debería ser mucho más confiable que las demás. 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, hará esto 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 a KeyDown
El uso de target.RaiseEvent (...) envía el evento directamente al destino 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 alguna razón, usaría InputManager.ProcessInput () en su lugar.
Ctrl+C
.)
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 da 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 claves virtuales se define aquí .
Para obtener la 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.
Utilice SendKeys para enviar combinaciones de teclas y combinaciones de teclas a la aplicación activa. No se puede crear una instancia de esta clase. Para enviar una pulsación de tecla a una clase y continuar inmediatamente con el flujo de su programa, use Enviar. Para esperar cualquier proceso iniciado por la pulsación de tecla, use SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft tiene más ejemplos 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 de codeplex Windows Input Simulator que simplificó al máximo la simulación de presionar una tecla:
Instale el paquete, se puede hacer o desde el administrador de paquetes NuGet o desde la consola del administrador de paquetes como:
Install-Package InputSimulator
Utilice estas 2 líneas de código:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
¡Y eso es!
-------EDITAR--------
La página del proyecto en codeplex está marcada por algún motivo, este es el enlace a la galería de NuGet.
API SendMessage de Windows con enviar WM_KEYDOWN .