Sie sind auf Seite 1von 7

oc est aqui: Inicio -> Artigos e Tutoriais -> Delphi -> Como ligar ou desligar Caps Lock usando

Delphi

Como ligar ou desligar Caps Lock usando Delphi

1 - Cdigo Completo Saber como ligar ou desligar o Caps Lock uma tcnica que pode ser muito til durante o desenvolvimento de um projeto. Por exemplo, suponhamos que voc queira que o usurio use somente letras maisculas durante o preechimento de alguns campos de um formulrio. Voc pode forar o Caps Lock a ficar ligado durante todo o tempo que o formulrio estiver ativo. Neste tutorial eu mostrarei como fazer isso mas, com um diferencial. Voc aprender passoa-passo o que est sendo feito. Desta forma, voc poder modificar o cdigo para melhor adapt-lo s suas necessidades. Vamos comear vendo o funcionamento do cdigo. Coloque um boto em um formulrio, d duplo-clique no boto e insira o cdigo 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 boto. Voc ver que a cada clique no boto, a "luzinha" do Caps Lock acesa ou apagada. Vamos ver como isso aconteceu? 2 - Entendendo o tipo TKeyboardState Logo no incio do cdigo ns definimos uma varivel 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 no nada mais que uma matriz unidimensional de 256 elementos do tipo Byte. 3 - Entendendo a funo GetKeyboardState

Logo aps o begin temos uma chamada funo GetKeyboardState: GetKeyboardState(KeyState); Veja que est funo recebe como argumento a varivel KeyState declarada anteriormente. Ainda no arquivo Windows.pas encontramos o prottipo desta funo: function GetKeyboardState(var KeyState: TKeyboardState): BOOL; stdcall; O prottipo nos indica que esta funo pede uma varivel do tipo TKeyboardState (que dever ser passada por referncia) e retorna um valor boolean. Na prtica este valor nunca testado. Mas voc pode experimentar. Como voc deve se lembrar, stdcall especifica que os parmetros para a funo sero passados da direita para a esquerda. Vejamos agora o corpo desta funo. Rolamos o arquivo Window.pas um pouco e encontramos: function GetKeyboardState; external user32 name 'GetKeyboardState'; Ah! Ento esta funo uma chamada na API do Windows? Sim, isso mesmo. Hora de abrir os arquivos de ajuda da API do Windows e pesquisar a funo GetKeyboardState. Encontramos: BOOL GetKeyboardState( PBYTE lpKeyState // array of status data ); Embora este trecho de cdigo esteja em C/C++, voc no ter dificuldades em entender. Veja que a funo 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 funo copia o status das 256 teclas virtuais para o buffer especificado. Ento, ao final da chamada: GetKeyboardState(KeyState); A varivel 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 contrrio ela est ativada. Olhando na tabela de cdigos de teclas virtuais vemos que a constante VK_CAPITAL serve a este propsito. 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 no ativada, podemos prosseguir com nosso exemplo. Nossa inteno ligar a tecla se ela estiver desligada e lig-la se esta estiver desligada. Vamos ao prximo tpico. Entendendo a funo 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 cdigo. Isso feito por meio da funo keybd_event. Esta funo permite simular o pressionamento de uma tecla. Isso quer dizer que voc consegue simular os eventos OnKeyUP e OnKeyDown apenas usando esta funo. Vamos investig-la. O primeiro passo consultar o Help do Delphi. Nada! Mais uns minutos de pesquisa e descobrimos que esta funo est definida no arquivo Windows.pas. Eis o prottipo: procedure keybd_event(bVk: Byte; bScan: Byte; dwFlags, dwExtraInfo: DWORD); stdcall; Rolamos o arquivo Windows.pas um pouquinho mais e encontramos a definio: procedure keybd_event; external user32 name 'keybd_event'; Hum! Outra chamada API do Windows. Vamos aos arquivos da API ento. 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 funo no retorna nada (VOID). O primeiro parmetro cdigo da tecla virtual a ser simulada. O segundo parmetro no 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 parmetro so as opes da funo. Os dois valores que podem ser fornecidos so KEYEVENTF_EXTENDEDKEY e KEYEVENTF_KEYUP. KEYEVENTF_KEYUP usado para especificar o evento OnKeyUP. Se omitido, o evento

ser OnKeyDown. O quarto parmetro 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 cdigo: 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 parmetro. Isso no importa. Poderia ser 1 ou qualquer valor entre 0 e 255. Apenas estas duas linhas de cdigo so suficientes para ligar ou desligar a tecla. Ento escrevemos cdigo em excesso? Na verdade no. Comeamos com um cdigo mais longo e um pouco repetitivo para mostrar-lhe os possveis usos da funo GetKeyboardState. Pode lhe ser til algum dia.

Das könnte Ihnen auch gefallen