Partilhar via


Como simular eventos de teclado (Windows Forms .NET)

O Windows Forms fornece algumas opções para simular programaticamente a entrada do teclado. Este artigo fornece uma visão geral dessas opções.

Usar SendKeys

O Windows Forms fornece a classe System.Windows.Forms.SendKeys para enviar pressionamentos de teclas para o aplicativo ativo. Há dois métodos para enviar pressionamentos de teclas para um aplicativo: SendKeys.Send e SendKeys.SendWait. A diferença entre os dois métodos é que SendWait bloqueia o thread atual quando o pressionamento de tecla é enviado, aguardando uma resposta, enquanto Send não. Para obter mais informações sobre SendWait, consulte Para enviar um pressionamento de tecla para um aplicativo diferente.

Cuidado

Se seu aplicativo for destinado a uso internacional com uma variedade de teclados, o uso de SendKeys.Send poderá produzir resultados imprevisíveis e deve ser evitado.

Nos bastidores, SendKeys usa uma implementação mais antiga do Windows para enviar entrada, o que pode falhar no Windows moderno, onde se espera que o aplicativo não esteja em execução com direitos administrativos. Se a implementação mais antiga falhar, o código tentará automaticamente a implementação mais recente do Windows para enviar entrada. Além disso, quando a classe SendKeys usa a nova implementação, o método SendWait não bloqueia mais o thread atual ao enviar pressionamentos de teclas para outro aplicativo.

Importante

Se o aplicativo depender de um comportamento consistente, independentemente do sistema operacional, você poderá forçar a classe SendKeys a usar a nova implementação adicionando a seguinte configuração de aplicativo ao arquivo app.config.

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

Para forçar a classe SendKeys a apenas usar a implementação anterior, use o valor "JournalHook" em vez disso.

Para enviar um pressionamento de tecla para o mesmo aplicativo

Chame o método SendKeys.Send ou SendKeys.SendWait da classe SendKeys. Os pressionamentos de tecla especificados serão recebidos pelo controle ativo do aplicativo.

O exemplo de código a seguir usa para simular pressionar as teclas ALT e DOWN juntas. Esses pressionamentos de tecla fazem com que o controle ComboBox exiba sua lista suspensa. Este exemplo pressupõe um Form com um Button e 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 um pressionamento de tecla para um aplicativo diferente

Os métodos SendKeys.Send e SendKeys.SendWait enviam pressionamentos de teclas para o aplicativo ativo, que geralmente é o aplicativo do qual você está enviando pressionamentos de teclas. Para enviar pressionamentos de teclas para outro aplicativo, primeiro você precisa ativá-lo. Como não há nenhum método gerenciado para ativar outro aplicativo, você deve usar métodos nativos do Windows para concentrar o outro aplicativo. O exemplo de código a seguir usa a invocação de plataforma para chamar os métodos FindWindow e SetForegroundWindow para ativar a janela do aplicativo Calculadora e, em seguida, chama Send para emitir uma série de cálculos para o aplicativo Calculadora.

O exemplo de código a seguir usa Send para simular teclas de pressionamento no aplicativo calculadora do Windows 10. Ele primeiro pesquisa uma janela de aplicativo com o título de Calculator e depois a ativa. Depois de ativados, os pressionamentos de teclas são enviados para calcular 10 mais 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

Usar métodos OnEventName

A maneira mais fácil de simular eventos de teclado é chamar um método no objeto que gera o evento. A maioria dos eventos tem um método correspondente que os invoca, nomeado no padrão de On seguido por EventName, como OnKeyPress. Essa opção só é possível em formulários ou controles personalizados, pois esses métodos são protegidos e não podem ser acessados de fora do contexto do controle ou formulário.

Esses métodos protegidos estão disponíveis para simular eventos de teclado.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

Para obter mais informações sobre esses eventos, consulte Usando eventos de teclado (Windows Forms .NET).

Consulte também