Precisa de um freelancer, códigos-fonte e exemplos completos? Bem-vindo(a) ao meu site. Além de realizar alguns serviços como freelancer eu tenho alguns códigos-fonte e exemplos completos de Java, Delphi, PHP, Python, C/C++, Hibernate, JPA, Spring, JSP, Servlets, Ruby, Ruby On Rails e muitas outras linguagens e frameworks. Veja como falar comigo clicando aqui.
Saber como ligar ou desligar o Caps Lock é
uma técnica que pode ser muito útil durante o
desenvolvimento de um projeto. Por exemplo, suponhamos que você
queira que o usuário use somente letras maiúsculas
durante o preechimento de alguns campos de um formulário.
Você pode forçar o Caps Lock a ficar ligado durante
todo o tempo que o formulário estiver ativo.
Neste tutorial eu mostrarei como fazer isso mas, com um diferencial.
Você aprenderá passo-a-passo o que está
sendo feito. Desta forma, você poderá modificar
o código para melhor adaptá-lo às suas
necessidades.
Vamos começar vendo o funcionamento do código.
Coloque um botão em um formulário, dê duplo-clique
no botão e insira o código abaixo em seu evento
OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var
KeyState:
TKeyboardState;
begin
GetKeyboardState(KeyState);
if(KeyState[VK_CAPITAL]
= 0) then
begin
Keybd_Event(VK_CAPITAL,
1, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL,
1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end
else
begin
Keybd_Event(VK_CAPITAL,
0, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL,
0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
end;
Execute o aplicativo e clique no botão. Você verá
que a cada clique no botão, a "luzinha" do
Caps Lock é acesa ou apagada. Vamos ver como isso aconteceu?
2 - Entendendo o tipo TKeyboardState
Logo no início do código nós definimos
uma variável chamada KeyState do tipo TKeyboardState:
KeyState: TKeyboardState;
O tipo TKeyboardState está na unit Windows. Ao abrirmos
o arquivo Windows.pas, (geralmente localizado em "C:\Arquivo
de programas\Borland\Delphi#\Source\Rtl\Win\Windos.pas"),
vemos que este tipo é definido como:
TKeyboardState = array[0..255] of Byte;
Ou seja, o tipo TKeyboardState não é nada mais
que uma matriz unidimensional de 256 elementos do tipo Byte.
3 - Entendendo a função GetKeyboardState
Logo após o begin temos uma chamada à função
GetKeyboardState:
GetKeyboardState(KeyState);
Veja que está função recebe como argumento
a variável KeyState declarada anteriormente. Ainda no
arquivo Windows.pas encontramos o protótipo desta função:
function GetKeyboardState(var
KeyState: TKeyboardState): BOOL; stdcall;
O protótipo nos indica que esta função
pede uma variável do tipo TKeyboardState (que deverá
ser passada por referência) e retorna um valor boolean.
Na prática este valor nunca é testado. Mas você
pode experimentar. Como você deve se lembrar, stdcall
especifica que os parâmetros para a função
serão passados da direita para a esquerda.
Vejamos agora o corpo desta função. Rolamos o
arquivo Window.pas um pouco e encontramos:
function GetKeyboardState;
external user32 name 'GetKeyboardState';
Ah! Então esta função é uma chamada
na API do Windows? Sim, isso mesmo. Hora de abrir os arquivos
de ajuda da API do Windows e pesquisar a função
GetKeyboardState. Encontramos:
BOOL GetKeyboardState(
PBYTE lpKeyState // array of status data
);
Embora este trecho de código esteja em C/C++, você
não terá dificuldades em entender. Veja que a
função recebe um ponteiro PBYTE para uma matriz
contendo 256 elementos do tipo byte. O tipo de dados BOOL é
identico ao boolean do Delphi.
O arquivo de ajuda nos diz que esta função copia
o status das 256 teclas virtuais para o buffer especificado.
Então, ao final da chamada:
GetKeyboardState(KeyState);
A variável KeyState (que é na verdade é
uma matriz unidimensional de 256 elementos do tipo Byte) conterá
256 elementos. Cada um destes elementos terá o valor
0 ou 1.
Muito bem! Tudo que temos que fazer agora é acessar o
elemento da matriz que corresponde à tecla Caps Lock
e verificar seu valor. Se o valor for 0, a tecla está
desativada, do contrário ela está ativada. Olhando
na tabela
de códigos de teclas virtuais vemos que
a constante VK_CAPITAL serve a este propósito. O valor
inteiro desta constante é 20. Assim, o elemento da matriz
correspondente a esta tecla pode ser acessado de duas formas:
if(KeyState[VK_CAPITAL]
= 1) then
begin
// Caps Lock está ativada
end;
Ou:
if(KeyState[20] = 0)
then
begin
// Caps Lock está desativada
end;
Depois de testarmos se a tecla Caps Lock está ou não
ativada, podemos prosseguir com nosso exemplo. Nossa intenção
é ligar a tecla se ela estiver desligada e ligá-la
se esta estiver desligada. Vamos ao próximo tópico.
Entendendo a função Keybd_Event
Agora que já sabemos como testar se a tecla Caps Lock
está ativada ou desativada, chegou a hora de aprendermos
como ligá-la ou desligá-la via código.
Isso é feito por meio da função keybd_event.
Esta função permite simular o pressionamento de
uma tecla. Isso quer dizer que você consegue simular os
eventos OnKeyUP e OnKeyDown
apenas usando esta função. Vamos investigá-la.
O primeiro passo é consultar o Help do Delphi. Nada!
Mais uns minutos de pesquisa e descobrimos que esta função
está definida no arquivo Windows.pas. Eis o protótipo:
Aqui vemos que a função não retorna nada
(VOID). O primeiro parâmetro é código da
tecla virtual a ser simulada. O segundo parâmetro não
é usado, ou seja, em nosso exemplo fornecemos 1 apenas
para indicar que a tecla seria ligada e 0 para indicar que a
tecla seria desligada. O terceiro parâmetro são
as opções da função. Os dois valores
que podem ser fornecidos são KEYEVENTF_EXTENDEDKEY e
KEYEVENTF_KEYUP. KEYEVENTF_KEYUP é usado para especificar
o evento OnKeyUP. Se omitido, o evento será
OnKeyDown. O quarto parâmetro pode ser
definido como 0.
Muito cuidado! Para simular o pressionamento de uma tecla é
preciso chamar keybd_event duas vezes. Primeiro simulamos OnKeyDown
e depois OnKeyUp. Assim, a tecla Caps Lock pode ser ligada ou
desligada com o seguinte trecho de código:
Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,
0);
Veja que agora definimos o valor 0 para o segundo parâmetro.
Isso não importa. Poderia ser 1 ou qualquer valor entre
0 e 255. Apenas estas duas linhas de código são
suficientes para ligar ou desligar a tecla.
Então escrevemos código em excesso? Na verdade
não. Começamos com um código mais longo
e um pouco repetitivo para mostrar-lhe os possíveis usos
da função GetKeyboardState. Pode lhe ser útil
algum dia.
Todo o conteúdo deste site,
quando não devidamente observado, pertence a seus idealizadores
e não
poderá ser usado para outras finalidades senão estudo e
aprimoramento de técnicas de programação.
Certifique-se de ler asnotas legaisantes de proceder com
o acesso e leitura do
conteúdo disponibilizado nestas páginas.