Você não está conectado. Conecte-se ou registre-se

Ver o tópico anterior Ver o tópico seguinte Ir em baixo  Mensagem [Página 1 de 1]

mistiyoda

Membro
Membro

avatar
Como ligar ou desligar Caps Lock usando Delphi
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:

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:

procedure keybd_event(bVk: Byte; bScan: Byte; dwFlags,
dwExtraInfo: DWORD); stdcall;

Rolamos o arquivo Windows.pas um pouquinho mais e encontramos a definição:

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:

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:

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.

http://www.portalmaker.co.cc

gun`s rose

Membro
Membro

avatar
Fechado [x]
Motivo:topico inutio

GuiFacchini

Moderador Global
Moderador Global

avatar
Porque Inútil? Eu sei que vc Pensou "TEM A TECLA PRA QUE ISSO" Sim, mas esse tuto envolve Passos Básicos Da Progamação. Ou seja Ajuda Iniciantes A Começar a ultilizar e Ingressar nesse ramo da Informática! ~Tópico ReAberto


_______________________________________________
My Sign!:


Ajudei?
Clica em

Conteúdo patrocinado


Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum