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
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.
'Mostra na tela o código da tecla apertada
MsgBox "KeyCode: " & KeyCode & " , Shift: " & Shift
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.
'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"
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:
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)
'Intercepta CTRL+C; CTRL+X; CTRL+INSERT e SHIFT+DELETE
Case 20067, 20088, 20045, 10067, 10046
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
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
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:
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:
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:
InterceptarTeclas.zip
eduardo Lima 14/07/2018 17:07:24
Ola! Gostaria de uma ajuda com teclas scroll lock, num lock e caps lock. Meu programa usa o código abaixo para entrar com valores direto em caixas texto pressionando teclas especificas, exp: tecla F2 acrescenta 1 a caixa "moedas de 5 centavos" ( maquina para contar moedas ). eu desmoitei um teclado usb antigo e usei a placa como interface. funciona muito bem. porem gostaria de usar os leds para acionar motor e solenoide da maquina. assim poderia programar para parar em determinado valor. segue o código das teclas que usei:
Me.teste1 = teste1 + 1
Me.teste2 = teste2 + 1
Me.teste3 = teste3 + 1
Me.teste4 = teste4 + 1
Case Is = vbKeyF6
Me.teste5 = teste5 + 1
Case Is = vbKeyS
Me.Seleção53 = Seleção53 + 1
Me.teste5 = teste5 = 0
Me.teste4 = teste4 = 0
Me.teste3 = teste3 = 0
Me.teste2 = teste2 = 0
Me.teste1 = teste1 = 0
pensei em algo tipo se o valor da ''caixatexto1" for igual ou maior q o da ''caixatexto2", o led numluck acende. assim teria três formas usar um teclado comum para enviar comandos do programa para maquina física e coletar muitos dados da maquina física para o programa. isso poderia ajudar muito em vários projetos. ps: nao sei programar, o que eu consegui foi lendo e copiando códigos nos blogs e apostilas.
um link do youtube mostrando como aproveitar o teclado> https://www.youtube.com/watch?v=srLINRLUS70
grato por qualquer ajuda! abçs!
Lucas 17/12/2015 17:48:57
Tem como eu limitar a macro autokeys a certos formulários?
Avelino Sampaio 15/07/2015 05:46:36
use a caixa de mensagem para saber o código correspondente a tecla pressionada.
matheus 14/07/2015 14:45:25
Como faço para interceptar a tecla Esc ?
Avelino Sampaio 20/05/2014 13:15:34
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
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.
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...
Call SequenciaSlideAvanca(Me.Name)
Function SequenciaSlideAvanca(strForm As String) 'função esta num módulo
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
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
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
Erick Lima 28/03/2014 15:18:02
Esta é mais uma dica maravilhosa... Assim como todas as outras!
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.
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?
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 ...