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
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
.NET Desktop feedback