Compartilhar 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 System.Windows.Forms.SendKeys classe para enviar pressionamentos de tecla para o aplicativo ativo. Existem dois métodos para enviar pressionamentos de tecla 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 SendWaito , consulte Para enviar um pressionamento de tecla para um aplicativo diferente.

Cuidado

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

Nos bastidores, SendKeys usa uma implementação mais antiga do Windows para enviar entrada, que pode falhar no Windows moderno, 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 tecla para outro aplicativo.

Importante

Se o aplicativo depender de um comportamento consistente, independentemente do sistema operacional, você poderá forçar a SendKeys classe 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 SendKeys classe a usar apenas a implementação anterior, use o valor "JournalHook" .

Para enviar um pressionamento de tecla para o mesmo aplicativo

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

O exemplo de código a seguir usa Send para simular o pressionamento das teclas ALT e DOWN juntas. Esses pressionamentos de tecla fazem com que o controle exiba ComboBox 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 SendKeys.Send métodos and SendKeys.SendWait enviam pressionamentos de tecla para o aplicativo ativo, que geralmente é o aplicativo do qual você está enviando pressionamentos de tecla. Para enviar pressionamentos de tecla 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 FindWindow métodos and 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 o pressionamento de teclas no aplicativo Calculadora do Windows 10. Ele primeiro procura uma janela de aplicativo com o título de Calculator e, em seguida, a ativa. Uma vez ativado, as teclas 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

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 controles ou formulários 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).

Confira também