Procedimiento para simular eventos de teclado (Windows Forms para .NET)
Windows Forms ofrece varias opciones para simular la entrada de teclado mediante programación. En este artículo se proporciona información general sobre estas opciones.
Uso de SendKeys
Windows Forms proporciona la clase System.Windows.Forms.SendKeys para enviar pulsaciones de tecla a la aplicación activa. Hay dos métodos para enviar pulsaciones de tecla a una aplicación: SendKeys.Send y SendKeys.SendWait. La diferencia entre los dos métodos es que SendWait
bloquea el subproceso actual cuando se envía la pulsación de tecla, en espera de una respuesta, mientras que Send
no lo hace. Para obtener más información sobre SendWait
, vea Para enviar una pulsación de tecla a otra aplicación.
Precaución
Si su aplicación está pensada para su uso internacional con distintos teclados, SendKeys.Send puede producir resultados imprevisibles y debe evitarse.
En segundo plano, SendKeys
usa una implementación anterior de Windows para enviar la entrada, lo que puede producir un error en las versiones modernas de Windows en las que se espera que la aplicación no se ejecute con derechos administrativos. Si se produce un error en la implementación anterior, el código intenta automáticamente la implementación de Windows más reciente para enviar la entrada. Además, cuando la clase SendKeys usa la nueva implementación, el método SendWait ya no bloquea el subproceso actual al enviar pulsaciones de tecla a otra aplicación.
Importante
Si la aplicación depende de un comportamiento coherente independientemente del sistema operativo, puede forzar que la clase SendKeys use la nueva implementación agregando la siguiente opción de configuración de la aplicación al archivo app.config.
<appSettings>
<add key="SendKeys" value="SendInput"/>
</appSettings>
Para forzar a la clase SendKeys a utilizar solo la implementación anterior, use el valor "JournalHook"
en su lugar.
Para enviar una pulsación de tecla a la misma aplicación
Llame al método SendKeys.Send o SendKeys.SendWait de la clase SendKeys . El control activo de la aplicación recibirá las pulsaciones de teclas especificadas.
En el ejemplo de código siguiente se usa Send
para simular que se presionan las teclas ALT y AV PÁG a la vez. Estas pulsaciones de tecla hacen que el control ComboBox muestre su lista desplegable. En este ejemplo se da por supuesto una instancia de Form con Button y ComboBox.
private void button1_Click(object sender, EventArgs e)
{
comboBox1.Focus();
SendKeys.Send("%+{DOWN}");
}
Private Sub Button1_Click(sender As Object, e As EventArgs)
ComboBox1.Focus()
SendKeys.Send("%+{DOWN}")
End Sub
Para enviar una pulsación de tecla a una aplicación diferente
Los métodos SendKeys.Send y SendKeys.SendWait envían pulsaciones de tecla a la aplicación activa, que suele ser la aplicación desde la que se envían las pulsaciones de tecla. Para enviar pulsaciones de tecla a otra aplicación, primero debe activarla. Como no hay ningún método administrado para activar otra aplicación, debe usar métodos nativos de Windows para asignar el foco a la otra aplicación. El ejemplo de código siguiente usa la invocación de la plataforma para llamar a los métodos FindWindow
y SetForegroundWindow
para activar la ventana de la aplicación Calculadora y, después, llama a Send
para emitir una serie de cálculos a la aplicación Calculadora.
En el ejemplo de código siguiente se usa Send
para simular la pulsación de teclas en la aplicación Calculadora de Windows 10. Primero busca una ventana de aplicación con el título Calculator
y, después, la activa. Una vez que se ha activado, las pulsaciones de tecla se envían para calcular 10 más 10.
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
private void button1_Click(object sender, EventArgs e)
{
IntPtr calcWindow = FindWindow(null, "Calculator");
if (SetForegroundWindow(calcWindow))
SendKeys.Send("10{+}10=");
}
<Runtime.InteropServices.DllImport("USER32.DLL", CharSet:=Runtime.InteropServices.CharSet.Unicode)>
Public Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr : End Function
<Runtime.InteropServices.DllImport("USER32.DLL")>
Public Shared Function SetForegroundWindow(hWnd As IntPtr) As Boolean : End Function
Private Sub Button1_Click(sender As Object, e As EventArgs)
Dim hCalcWindow As IntPtr = FindWindow(Nothing, "Calculator")
If SetForegroundWindow(hCalcWindow) Then
SendKeys.Send("10{+}10=")
End If
End Sub
Uso de métodos OnEventName
La forma más fácil de simular eventos de teclado consiste en llamar a un método en el objeto que genera el evento. La mayoría de los eventos tienen un método correspondiente que los invoca, cuyo patrón es On
seguido de EventName
, como en OnKeyPress
. Esta opción solo es posible dentro de controles o formularios personalizados, porque estos métodos están protegidos y no se puede acceder a ellos fuera del contexto del control o formulario.
Estos métodos protegidos están disponibles para simular eventos de teclado.
OnKeyDown
OnKeyPress
OnKeyUp
Para obtener más información sobre estos eventos, vea Uso de eventos de teclado (Windows Forms para .NET).
Vea también
.NET Desktop feedback