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.
 
Arquivo de Códigos - Página Inicial
Códigos-fonte
» Códigos-fonte e exemplos completos
Linguagens
» ActionScript
» Adobe AIR
» Adobe Flex
» AJAX
» C
» C#
» C++
» CSS
» Delphi
» DHTML - Dynamic HTML
» HTML/XHTML
» Java
» JavaFX
» JavaScript
» Java Servlets
» JSP - Java Server Pages
» Perl
» PHP
» PHP-GTK
» Python
» Ruby
» Tcl/Tk
» VB.NET
Bancos de Dados
» IBM DB2
» MySQL
Frameworks
» CodeIgniter
» jQuery
» JSF - Java Server Faces
» Qt
» Ruby On Rails
» Struts
» Struts 2
» wxWidgets
» Zend Framework
Container/Servidor
» Apache Tomcat
» Apache Web Server
Ferramentas
» Apache Ant
» iTextSharp (iText#)
Referências
» CSS1 e CSS2
» JavaScript
Serviços On-Line
» Qual é meu IP?
» Tabela Cores HTML I
» Tabela Cores HTML II
» Lista de Mime Types
» Códigos Teclas Virtuais
Usuários On-Line
Visitantes:
PHP
O que há de novo no PHP 5?
40 dicas e truques sobre como trabalhar com datas e horas em PHP
60 dicas e truques sobre como trabalhar com strings e caracteres em PHP
PHP e a Orientação a Objetos - POO (Curso Completo)

DHTML
Curso completo de DHTML para iniciantes

CSS
Como definir uma imagem de fundo fixa na página
Definindo uma imagem de fundo para botões HTML
Você está aqui: Inicio -> Tutoriais -> Delphi
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.
 
 
Arquivo de Códigos - Página Inicial
Veja dicas, truques e anotações de .NET Framework
Entenda a classe StreamReader
Entenda a classe StreamWriter
Veja dicas, truques e anotações de outras linguagens
PHP - Quer gerar ou manipular JSON (JavaScript Object Notation) a partir do PHP? Comece lendo esta dica
jQuery - Entenda os parâmetros que podem ser usados com o método ajax()
C# (CSharp) - Como criar, atribuir valores e percorrer um array de duas dimensões em C#
Python - Como redirecionar para outra página ou site
VB.NET - Exemplo de como declarar e alocar um array de inteiros usando VB.NET
Ruby - Usando o método slice() para obter uma substring informando a posição inicial e a quantidade de caracteres
Adobe Flex - Entendendo a classe ComboBox
C - Alocando memória dinâmica usando a função calloc()
VB.NET - Como desmarcar (retirar a seleção) todos os itens de uma lista de uma só vez
C - Saiba mais sobre true e false em C e C++

       

http://www.arquivodecodigos.net
:: Arquivo de Códigos - Softwares e Consultoria em Programação ::
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 as notas legais antes de proceder com o acesso e leitura do
conteúdo disponibilizado nestas páginas.

Fale Conosco: (62) 3261-7018 / (62) 8185-0734

Desenvolvedor Responsável: Osmar J. Silva

Página Inicial Contatos Pesquisar Mapa do Site