... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$182,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Como interceptar teclas e combinações de teclas

Os formulários e seus objetos possuem eventos para a interceptação de teclas, que são:

Ao apertar tecla
Ao liberar tecla
Ao pressionar tecla

Evento "Ao apertar tecla"

É usado para interceptar combinações de teclas, como por exemplo :

ALT+F4; CTRL+C; SHIFT+DELETE; ...

Observe no procedimento abaixo que o referido evento possui os argumentos keyCode e Shift

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

End Sub

Através do argumento SHift é possível saber se uma das seguintes teclas foi apertada: CTRL, SHIFT ou ALT.  Para cada tecla apertada, o argumento retorna um número correspondente:

Tecla SHIFT retorna o número 1
Tecla CTRL retorna o número 2
Tecla ALT retorna o número 4

O argumento KeyCode retorna o número correspondente da tecla que foi apertada. 

Para saber qual número corresponde à tecla apertada, utilize a função Msgbox() no evento.

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
   'Mostra na tela o código da tecla apertada
   MsgBox "KeyCode: " & KeyCode & " , Shift: " & Shift
End Sub

Vamos supor que seja apertada a combinação CTRL+F4, os argumentos do evento retornam os seguintes valores:

Argumento Shift = 2 (tecla CTRL)
Argumento keyCode = 115 (tecla F4)

Veja abaixo um exemplo de código que bloqueia as seguintes combinações de teclas:

CTRL+(+); CTRL+(-); ALT+F4; CTRL+F4; CTRL+W; PageDown e PageUp. 

O código também dispara a abertura do site UsandoAccess, com a combinação das teclas SHIFT+W.

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'-------------------------------
'SHIFT = 1 | CTRL = 2 | ALT = 4
'-------------------------------
Select Case Val((Shift*100) & KeyCode)
   '------------------------------------------------------------------------
   'Intercepta CTRL+(+); CTRL+(-); ALT+F4; CTRL+F4; CTRL+W; PageDown e PageUp
   '------------------------------------------------------------------------
   Case 200187,200189,200107,200109,400115,200115,20087,33,34,20033,20034
      KeyCode = 0 'Neutraliza a tecla apertada
   Case 10087 'SHIFT(1) + W(87)
      '------------------------------------------------
      'Abre o navegador carregando o site UsandoAccess
      '------------------------------------------------
      Application.FollowHyperlink "http:\\www.usandoaccess.com.br"
End Select
End Sub

Observe que para neutralizar a tecla apertada, basta alterar o argumento keyCode para zero.

O código acima está sendo utilizado no evento do formulário e isto significa que em qualquer parte do formulário as combinações de teclas serão detectadas.

Habilitando os eventos do formulário

Os eventos "Ao apertar tecla" e "Ao pressionar tecla" dos formulários, por padrão, ficam desabilitados.  Para habilitá-los é necessário alterar a propriedade "Visualizar teclas" para  SIM.  Veja na imagem:

Usando Access - Visualizar teclas

Já os eventos dos controles estão habilitados, por padrão.

Evento aplicado em um campo

Observe o código utilizado no evento "Ao apertar tecla" de um campo, cujo o objetivo é o de bloquear as seguintes combinações:

CTRL+C; CTRL+X; CTRL+INSERT; SHIFT+DELETE. 

Private Sub txMemo_KeyDown(KeyCode As Integer, Shift As Integer)
'-------------------------------
'SHIFT = 1 | CTRL = 2 | ALT = 4
'-------------------------------
Select Case Val((Shift*100) & KeyCode)
   '-------------------------------------------------------
   'Intercepta CTRL+C; CTRL+X; CTRL+INSERT e SHIFT+DELETE
   '-------------------------------------------------------
   Case 20067, 20088, 20045, 10067, 10046
      KeyCode = 0
End Select
End Sub

Este código impede que o usuário copie o texto do campo ao usar as combinações de teclas.

Evento "Ao pressionar tecla"

Este evento é usado para interceptar teclas individuais.  Veja alguns exemplos:

1. Campo que aceita somente caracteres numéricos mais a tecla de retroceder:

Private Sub txNumero_KeyPress(KeyAscii As Integer)
'Os códigos 48(0) a 57(9) representam os números pressionados
'O código 8 representa a tecla de retroceder
'keyAscii = 0 neutraliza a tecla pressionada
If Not Eval(KeyAscii & " between 48 and 57") And Not KeyAscii = 8 Then KeyAscii = 0
End Sub

2. Passa automaticamente a letra pressionada para maiúscula

Private Sub txtMaiusculas_KeyPress(KeyAscii As Integer)
'A função Chr() retorna a letra correspondente ao número keyAscii
'A função UCase() passa a letra para maiúscula
'A função Asc() retorna o número correspondente da letra 
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub

O aplicativo oferecido no artigo, tem o formulário frmTeste, aonde você poderá testar os códigos aqui apresentados.  Veja o formulário na imagem abaixo e observe os comentários em vermelho e azul:Usando Access - Interceptar teclas

Macro Autokeys

Com esta macro é possível neutralizar teclas e/ou combinações de teclas em qualquer ambiente do seu aplicativo. Observe na imagem abaixo que a função da tecla F1 (Ajuda do Access) está neutralizada ao ter sido reprogramada para gerar apenas um Bip. 

Pode-se também criar uma combinação de teclas para executar uma determinada tarefa. Veja que está sendo utilizada a combinação CTRL+F (^f) para abrir o formulário de nome frmTeste2:

Usando Access - Macro Autokeys


Desabilitando teclas especiais do Access

Através das Opções do Access > Banco de dados atual  pode-se desabilitar as teclas especiais do Access que são: F11, AlT+F11 e CTRL+G e para isso, basta desmarcar a opção assinalada.  Veja:

Usando Access - Teclas especiais do Access

Arquivo exemplo

Faça o download abaixo:

Bom estudo!


 

 


10 comentário(s)

Augusto   27/03/2014 12:10:32

Parabéns Avelino..
Mais uma vez suas dicas e observações serão de grande utilidade na elaboração de qualquer aplicativo ...
Ótima dica .....

Marcelo David   27/03/2014 18:56:27

Olá Avelino, mais uma vez de parabéns!
As macros AutoKeys poderão auxilia na segurança,do,aplicativo,
interceptando o pressionamento das teclas de atalho. Será que estou certo?

João Ricardo   27/03/2014 23:07:59

Parabéns Avelino,
Tanto pelo conhecimento qto pela iniciativa de ajudar de forma perfeitamente didática.

Suas dicas e videoaulas me fazem recordar dos melhores professores que tive.

Erick Lima   28/03/2014 15:18:02

Esta é mais uma dica maravilhosa... Assim como todas as outras!
Parabéns pelo seu trabalho...

MARCIO MELO MARTINS   29/03/2014 02:19:59

Muito didático, agora da para saber os comandos sem precisar de uma tabelinha, antes eu usava o nome... por exemplo Seta para direita vbKeyRight que em número é 39, faz o mesmo efeito.
Só uma dúvida. Eu fiz um código que coloquei no evento Form_KeyDown para quando acionar a tecla seta direita abrir o próx. Form Dinâmico... O código só funciona uma única fez, abre o próx. form certinho, que tem o mesmo código...
Case 39
Call SequenciaSlideAvanca(Me.Name)
Function SequenciaSlideAvanca(strForm As String) 'função esta num módulo
'On Error Resume Next
Dim strProxForm, Filtro As String
Dim i, idSeq As Integer
'Buscar o registro, comparar a próx. seg.
'pegar a id da seguência, usando o nome do form q esta aberto strForm = (Me.Name)
idSeq = DLookup("Sequencia", "tblSeqForm", "FormNome = '" & strForm & "'")
'Loop na sequência de Slide
For i = 1 To 20
idSeq = idSeq + 1
strProxForm = DLookup("FormNome", "tblSeqForm", "Sequencia = " & idSeq & " AND TagOcultar = 0")
If Len(strProxForm) > 0 Then
DoCmd.Close acForm, strForm, acSaveYes 'fecha o frm atual
DoCmd.OpenForm strProxForm, acFormPivotChart 'abre próx. form
Exit Function
End If
Next
End Function

O código só funciona uma fez, o próximo form que abre não interpreta as teclas, mas se eu fechar ele e abrir, passa a funcionar. Já tentei forçar Form_Load() Me.KeyPreview = True, todos estão True em visualizar teclas, quando vi que lançou este artigo retomei essa idéia trocando os comandos em nome por os de números, ficou do mesmo jeito.

Há, no seu Exemplo, no segundo Form, onde você pede para usar as Teclas - Control + F para fechar o form pela macro; tem de corrigir a macro, ela esta executando abrir form

Forte abraço!

WSenna   20/05/2014 12:31:07

Grande Avelino.

Parabéns pela esplêndida aula acima.
Só resta uma pergunta a saber:
Como inibir a combinação Ctrl + Alt + Del
Confesso que já tentei tudo mas não consegui o efeito desejado.

Abraços, WSenna

Avelino Sampaio   20/05/2014 13:15:34

Wagner,

a combinação em quetsão é inerente ao Windows e não ao Access. Copie cole os links indicados abaixo para o seu navegador e assim pesquisar sobre o assunto:

http://comunidade.itlab.com.br/eve/forums/a/tpc/f/331603531/m/3071097711?r=3071097711#3071097711

http://comunidade.itlab.com.br/eve/forums?a=search&reqWords=Ctrl+%2B+Alt+%2B+Del

Bom estudo!

matheus   14/07/2015 14:45:25

Como faço para interceptar a tecla Esc ?

Avelino Sampaio   15/07/2015 05:46:36

Matheus,

use a caixa de mensagem para saber o código correspondente a tecla pressionada.

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'Mostra na tela o código da tecla apertada
MsgBox "KeyCode: " & KeyCode & " , Shift: " & Shift
End Sub

Sucesso!

Lucas   17/12/2015 17:48:57

Tem como eu limitar a macro autokeys a certos formulários?


Envie seu comentário: