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