1 - Código Completo 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:
- Código:
-
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 TKeyboardStateLogo no início do código nós definimos uma variável chamada KeyState do tipo TKeyboardState:
- Código:
-
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:
- Código:
-
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:
- Código:
-
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:
- Código:
-
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:
- Código:
-
if(KeyState[VK_CAPITAL] = 1) then
begin
// Caps Lock está ativada
end;
Ou:
- Código:
-
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:
- Código:
-
procedure keybd_event(bVk: Byte; bScan: Byte; dwFlags,
dwExtraInfo: DWORD); stdcall;
Rolamos o arquivo Windows.pas um pouquinho mais e encontramos a definição:
- Código:
-
procedure keybd_event; external user32 name 'keybd_event';
Hum! Outra chamada à API do Windows. Vamos aos arquivos da API então. Veja o que encontramos:
- Código:
-
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // function options
ULONG_PTR dwExtraInfo // additional keystroke data
);
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:
- 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.
Fonte: http://www.arquivodecodigos.net/arquivo/tutoriais/delphi/ligar_desligar_caps_lock.php