Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
.NET Desktop feedback