Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.
OnKeyDownOnKeyPressOnKeyUp
Para obter mais informações sobre esses eventos, consulte Usando eventos de teclado.
Ver também
.NET Desktop feedback