Compartir a través de


Cómo simular eventos de teclado

Windows Forms proporciona algunas opciones para simular mediante programación la entrada del teclado. En este artículo se proporciona información general sobre estas opciones.

Uso de SendKeys

Windows Forms proporciona la System.Windows.Forms.SendKeys clase 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, esperando una respuesta, mientras Send no. Para obtener más información sobre SendWait, vea Para enviar una pulsación de tecla a otra aplicación.

Precaución

Si la aplicación está pensada para su uso internacional con varios teclados, el uso de SendKeys.Send podría producir resultados imprevisibles y debe evitarse.

En segundo plano, SendKeys usa una implementación de Windows anterior para enviar la entrada, lo que podría producir un error en Windows, donde 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 más reciente de Windows para enviar la entrada. Además, cuando la SendKeys clase usa la nueva implementación, el SendWait método ya no bloquea el subproceso actual al enviar pulsaciones de tecla a otra aplicación.

Importante

Si la aplicación se basa en un comportamiento coherente independientemente del sistema operativo, puede forzar que la clase use la SendKeys nueva implementación agregando la siguiente configuración de aplicación al archivo app.config.

<appSettings>
  <add key="SendKeys" value="SendInput"/>
</appSettings>

Para forzar que la SendKeys clase solo use 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 recibe las pulsaciones de tecla especificadas.

En el ejemplo de código siguiente se usa Send para simular la pulsación de las teclas alt y flecha abajo juntas. Estas pulsaciones de tecla hacen que el ComboBox control muestre su lista desplegable. En este ejemplo, se asume un Form con un Button y un 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 otra aplicación

Los SendKeys.Send métodos 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 pulsaciones de teclas. Para enviar pulsaciones de tecla a otra aplicación, primero debe activarla. Dado que no hay ningún método administrado para activar otra aplicación, debe usar métodos nativos de Windows para centrar la otra aplicación. En el ejemplo de código siguiente se usa la invocación de plataforma para llamar a los métodos FindWindow y SetForegroundWindow para activar la ventana de la aplicación Calculadora y, a continuación, se 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. Primero busca una ventana de aplicación con el título de Calculator y, a continuación, la activa. Una vez activada, 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 manera más fácil de simular eventos de teclado es 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, denominado según el patrón On seguido por EventName, como OnKeyPress. Esta opción solo es posible dentro de los controles o formularios personalizados, ya que estos métodos están protegidos y no se puede tener acceso desde 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.

Consulte también