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 :

Private Sub Text1_KeyPress(KeyAscii As Integer)
   Char = Chr(KeyAscii)
   KeyAscii = Asc(UCase(Char))
End Sub

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.

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
   Dim ShiftDown, AltDown, CtrlDown, Txt
   ShiftDown = (Shift And vbShiftMask) > 0
   AltDown = (Shift And vbAltMask) > 0
   CtrlDown = (Shift And vbCtrlMask) > 0
   If KeyCode = vbKeyF2 Then   ' Display key combinations.
   If ShiftDown And CtrlDown And AltDown Then
      Txt = "SHIFT+CTRL+ALT+F2."
   ElseIf ShiftDown And AltDown Then
      Txt = "SHIFT+ALT+F2."
   ElseIf ShiftDown And CtrlDown Then
      Txt = "SHIFT+CTRL+F2."
   ElseIf CtrlDown And AltDown Then
      Txt = "CTRL+ALT+F2."
   ElseIf ShiftDown Then
      Txt = "SHIFT+F2."
   ElseIf CtrlDown Then
   Txt = "CTRL+F2."
   ElseIf AltDown Then
      Txt = "ALT+F2."
   ElseIf SHIFT = 0 Then
      Txt = "F2."
   End If
   Text1.Text = "Você pressionou a tecla " & Txt
   End If
End Sub

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:

  1. KeyDown  
  2. KeyPress
  3. KeyUp

Vamos criar um pequeno projeto  onde iremos mostrar como gerenciar alguns eventos de teclado no VB.NET.

  1. Inicie um novo projeto no Visual Studio do tipo - Visual Basic Projects usando o template Windows Application
  2. O nome do projeto será AcessaBD e será salvo na pasta c:\vbnet
  3. No formulário padrão insira os seguintes controles :(conforme o layout abaixo)

- 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 :

  1. Enter
  2. GotFocus
  3. Leave
  4. Validating
  5. Validated
  6. LostFocus

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 controle

If 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 :
BACKSPACE {BACKSPACE}, {BS}, or {BKSP}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
DEL or DELETE {DELETE} or {DEL}
DOWN ARROW {DOWN}
END {END}

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 If

End 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
      MessageBox.Show("Você pressionou a tecla => " & Keys.Shift)
   End If
End Sub

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 Sub
Private 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 Twitter

 

Referências:


José Carlos Macoratti