 VB .NET  - Gerenciando os eventos de teclado
  
VB .NET  - Gerenciando os eventos de teclado
Como você faria para detectar qual tecla foi pressionada em uma aplicação VB.NET ?
Se você conhece qualquer versão do Visual Basic anterior ao VB.NET , talvez tivesse a resposta na ponta da língua ... Mas vamos voltar ao VB.NET . Como você faria isto no VB.NET ?
Com certeza a primeira coisa que lhe viria a cabeça seria usar os eventos : KeyPress , KeyDown e KeyUp. Então , vamos recordar...
No VB 6.0 faríamos assim :
No caso do evento KeyPress usamos o parâmetro KeyAscII assim :
|  | 
Nota: Podemos trocar a tecla pressionada por outra , como por exemplo , quando o usuário pressionar a tecla com o ponto para trocar pela virgula usamos o código : If KeyAscii = Asc(".") Then KeyAscii = Asc(",") . Podemos também evitar o sinal sonoro (beep) atribuindo o valor zero a keyAscii : Ex: KeyAscii = 0
No caso dos eventos KeyDown e KeyUp usamos o parâmetro KeyCode.
|  | 
Então , como saber o código da tecla pressionada no VB.NET ?
Para fazer isto no VB.NET podemos usar a função ChrW ou o método ToChar da classe Convert além de usar a conversão para uma cadeia de caracteres usando a letra C depois da cadeia ( válido somente para as teclas normais), o código usado pode ser o seguinte :
If e.KeyChar =
Convert.ToChar(Keys.Return) 
Then
If e.KeyChar =
ChrW(Keys.Return) Then
If e.KeyChar =
"."c Then
Nota :Os eventos de teclado ocorrem na seguinte ordem:
Vamos criar um pequeno projeto onde iremos mostrar como gerenciar alguns eventos de teclado no VB.NET.
| 
    
     | - Dois 
    controles TextBox - TxtValor para receber valores  e TxtData para 
    receber datas - Dois controles Button - btnIncluir e btnSair - Um controle ListBox - ListBox1 O objetivo e preencher os TextBox e incluir os valores informados no ListBox | 
Vejamos agora o código associado a cada controle :
1- O evento ENTER do controle TextBox - txtValor.text - Ao receber o foco o conteúdo do controle é selecionado.
| Private
    Sub 
    txtValor_Enter(ByVal 
    sender As System.Object,
    ByVal e 
    As System.EventArgs)
    Handles 
    txtValor.Enter, txtData.Enter ' ao receber o foco , o conteudo do controle será selecionado CType(sender, TextBox).SelectAll() End Sub | - O evento
    Enter é usado para que quando controle receber o foco todo o conteúdo 
    do controle será selecionado. O evento de Focus ocorre na seguinte ordem : 
 | 
2- O evento KeyPress do controle TxtValor : Se teclar ENTER o foco vai para o controle txtData ; se for pressionado o ponto será convertido para vírgula.
| Private 
    Sub txtValor_KeyPress(ByVal 
    sender As System.Object,
    ByVal e 
    As System.Windows.Forms.KeyPressEventArgs)
    Handles 
    txtValor.KeyPress 
 ' ao pressionar a tecla ENTER ( Return) o foco vai para o proximo controleIf e.KeyChar = Convert.ToChar(Keys.Return) Then e.Handled =True txtData.Focus() ElseIf e.KeyChar = "."c Then ' converte o ponto para virgula e.Handled =True SendKeys.Send(",") End If End Sub | A 
    propriedade  - KeyPressEventArgs.KeyChar - obtém o caractere 
    correspondente a tecla pressionada no caso representada pela letra e. - e.Handle = True tem o mesmo efeito que KeyAScii = 0 , ou seja, evita o efeito sonoro (beep). - Se a tecla pressionada for igual ao ponto (.) será convertido para vírgula (,) = Sendkeys.Send(,) 
 | 
3- O evento KeyPress do controle TxtData ; Pressionando ENTER o foco vai para botão Incluir ; Se pressionarmos : ponto , virgula ou traço , estes caracteres serão convertidos para barra ( / ).
| Private 
    Sub txtData_KeyPress(ByVal 
    sender As System.Object,
    ByVal e 
    As System.Windows.Forms.KeyPressEventArgs)
    Handles 
    txtData.KeyPress Select Case e.KeyChar Case Convert.ToChar(Keys.Return) 'ChrW(Keys.Return) e.Handled =True btnIncluir.Focus() Case "."c, ","c, "-"c 'ao pressionar . , ou - serão convetidos para / e.Handled =True SendKeys.Send("/") End Select End Sub | - O método Send 
    da classe SendKeys envia o código da tecla para a aplicação ativa.  
    Cada tecla é representada por um ou mais caracteres. Para enviar  a 
    tecla A use o código A.Alguns teclas possuem caracteres especiais . Abaixo 
    alguns valores : 
 No exemplo estamos enviando a barra : / | 
4- Evento Click do controle ListBox ; Inclui os valores digitados nas caixas de texto no controle ListBox.
| Private 
    Sub btnIncluir_Click(ByVal 
    sender As System.Object,
    ByVal e 
    As System.EventArgs)
    Handles 
    btnIncluir.Click ' inclui o conteúdo das caixas de texto no listbox ListBox1.Items.Add(txtValor.Text & ", " & txtData.Text) txtValor.Focus() End Sub | - ListBox1.Items.Add(txtValor.Text & ", " & txtData.Text) | 
5- O evento KeyDown do controle ListBox ; a pressionar a tecla Delete o item selecionado no controle será removido.
| Private 
    Sub ListBox1_KeyDown(ByVal 
    sender As 
    Object, 
    _ ByVal e As System.Windows.Forms.KeyEventArgs) _ Handles ListBox1.KeyDown ' Ao pressionar a tecla Delete eliminamos o elemento selecionado no listbox If e.KeyCode = Keys.Delete Then ListBox1.Items.Remove(ListBox1.SelectedItem) End IfEnd Sub | - ListBox1.Items.Remove(ListBox1.SelectedItem) | 
Alem das teclas padrão podemos querer gerenciar as teclas SHIFT , ALT e CTRL ; conhecidas como teclas modificadoras. Para determinar quando uma dessas teclas foi pressionada podemos usar o seguinte código :
| 
    Private Sub button1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) 
    Handles button1.KeyPress    
    If (Control.ModifierKeys And Keys.Shift) = Keys.Shift Then | 
A propriedade - Control.ModifierKeys - obtém o valor que indica qual modificador (SHIFT, CTRL, and ALT) foi pressionada
Criando efeitos com a Tecla seta para cima e set para baixo
Que tal obter o seguinte efeito: Em um formulário com algumas caixas de texto , quando a caixa de texto tiver com o foco se você pressionar seta para baixo (KeyDown) o foco vai para o próximo controle , e, se você pressionar tecla para cima(KeyUp) vai para o controle anterior.
Inicie um novo projeto do tipo Windows Application e no formulário padrão form1.vb inclua três caixas de texto e um botão de comando. Agora inclua o seguinte código no formulário:
| Private Sub MoverFoco(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        ' Verifica a tecla pressionada e obtem o proximo controle ou o anterior, dependendo da tecla pressionada
        If e.KeyCode = Keys.Up Then
            If Not Me.GetNextControl(sender, False) Is Nothing Then Me.GetNextControl(sender, False).Focus()
        ElseIf e.KeyCode = Keys.Down Or e.KeyCode = Keys.Enter Then
            If Not Me.GetNextControl(sender, True) Is Nothing Then Me.GetNextControl(sender, True).Focus()
        End If
End SubPrivate Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    MoverFoco(sender, e)
End Sub
Private Sub TextBox2_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown
    MoverFoco(sender, e)
End Sub
Private Sub TextBox3_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox3.KeyDown
     MoverFoco(sender, e)
End Sub
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    e.Handled = True
End Sub | 
A função MoverFoco(sender,e) é responsável em mover o foco para o controle anterior/posterior quando o usuário pressionar a tecla KeyUP/KeyDown.
A função para KeyPress em TextBox1 apenas evita o beep que a tecla ENTER gera , pois e.Handled = True evita o beep.
Pesquisando a ajuda do VB.NET você vai encontrar muito mais detalhes sobre o assunto.
Até mais ver...
| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique 
	e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? | 
  
    Gostou ?   Compartilhe no Facebook
Compartilhe no Facebook
  
 Compartilhe no Twitter
 
Compartilhe no Twitter
  
  
Referências: