Partilhar via


Como simular eventos de teclado

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

Windows Forms fornece a System.Windows.Forms.SendKeys classe 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 Como enviar uma tecla de atalho para outra aplicação.

Atenção

Se a sua aplicação se destina a uso internacional com vários teclados, a utilização de SendKeys.Send pode produzir resultados imprevisíveis e deve ser evitada.

Nos bastidores, SendKeys usa uma implementação mais antiga do Windows para enviar entrada, que pode falhar no Windows, onde se espera que o aplicativo não esteja sendo executado 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 SendKeys classe usa a nova implementação, o SendWait método não bloqueia mais o thread atual ao enviar pressionamentos de teclas para outro aplicativo.

Importante

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

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

Para forçar a SendKeys classe a usar apenas 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. As teclas especificadas são recebidas pelo controle ativo do aplicativo.

O exemplo de código a seguir usa Send para simular pressionar as teclas Alt e Seta para baixo juntas. Essas teclas pressionadas fazem com que o controle exiba ComboBox sua lista suspensa. Este exemplo pressupõe um Form com a 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 SendKeys.Send métodos 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 focar o outro aplicativo. O exemplo de código a seguir usa platform invoke para chamar os métodos FindWindow e SetForegroundWindow para ativar a janela do aplicativo Calculator e, em seguida, chama Send para emitir uma série de cálculos para o aplicativo Calculator.

O exemplo de código a seguir usa Send para simular pressionar teclas no aplicativo Calculadora do Windows. Primeiro, procura uma janela de aplicação com o título de Calculator e, em seguida, ativa-a. Uma vez ativado, as teclas pressionadas são enviadas 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

Utilize os 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 dentro de controles ou formulários personalizados, porque 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.

Ver também