17 de março de 2012

Como criar um Teclado Virtual utilizando Delphi

Editar postagem
Basicamente, o que você observa em um teclado virtual quando o utiliza?
- sempre fica sobre as janelas e programas abertos.
- não recebe o foco ao clicar nas teclas.
- envia teclas para o objeto ativo.

Sabendo disso, para criar um teclado virtual em Delphi, vamos precisar fazer o seguinte:

1º Definir a propriedade FormStyle do Form para fsStayOnTop.
2º Incluir o código abaixo no projeto.
private
  { Private declarations }
protected
  { Protected declarations }
  procedure CreateParams(var Params: TCreateParams); override;
public
  { Public declarations }
end;

//alterar TForm1 para o nome do seu formulário
procedure TForm1.CreateParams(var Params: TCreateParams);
const
  WS_EX_NOACTIVATE = $8000000;
begin
  inherited;
  Params.ExStyle := Params.ExStyle + WS_EX_NOACTIVATE;
end;
3º Utilizar o comando keybd_event, conforme os exemplos:
//teclas normais
keybd_event(Ord('A'), 0, 0, 0); //pressiona tecla [A]
keybd_event(Ord('A'), 0, KEYEVENTF_KEYUP, 0); //libera tecla [A]
//ou
keybd_event(65, 0, 0, 0); //pressiona tecla [A]
keybd_event(65, 0, KEYEVENTF_KEYUP, 0); //libera tecla [A]

//teclas especiais
keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY or 0, 0); //pressiona Backspace
keybd_event(VK_BACK, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); //libera Backspace

//simular letra maiúscula
keybd_event(VK_LSHIFT, 0, KEYEVENTF_EXTENDEDKEY or 0, 0); //pressiona Shift esquerdo
keybd_event(65, 0, 0, 0); //pressiona tecla [A]
keybd_event(65, 0, KEYEVENTF_KEYUP, 0); //libera tecla [A]
keybd_event(VK_LSHIFT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); //libera Shift esquerdo

//simular acento agudo
keybd_event(219, 0, 0, 0); //pressiona acento agudo
keybd_event(219, 0, KEYEVENTF_KEYUP, 0); //libera acento agudo
keybd_event(65, 0, 0, 0); //pressiona tecla [A]
keybd_event(65, 0, KEYEVENTF_KEYUP, 0); //libera tecla [A]
Com isso você já consegui criar seu próprio teclado virtual.

teclado virtual delphi keyboard



Google Docs

teclado virtual delphi keyboard



Não se esqueça de liberar uma tecla após pressioná-la.

teclado virtual delphi keyboard



Tabela ASCII
Tabela Virtual Key

teclado virtual delphi keyboard



http://www.devmedia.com.br/forum/viewtopic.asp?id=367715

6 comentários:

  1. Parabéns Mateus! Um belo exemplo de controle de teclas e funções do Delphi.

    ResponderExcluir
  2. Boa tarde.
    Muito bom o artigo, foi o melhor que achei, o Delphi XE7 tem um teclado virtual para VCL, eu queria no FMX,pra Windows.
    O tempo que gastei procurando tinha feito 2 programas.
    principalmente porque ele vai ser usado só dentro do meu programa.
    Tudo isso porque o Tablet com Windows 10, não abre o teclado quando você entra para edição.
    Valeu.

    ResponderExcluir
    Respostas
    1. Já faz um bom tempo que não mexo com Delphi, mas foi muito útil para mim na época que usava, é sempre bom compartilhar, que bom que te ajudou!

      Excluir
  3. Olá Mateus, estou com uma dúvida... Criei dois forms: um form com um edit e um botão e um form para o teclado da forma como você fez, só que quero que o teclado só apareça quando clicar no botão do form1... Não consegui fazer com que o form do teclado fique sem o foco. Já defini a propriedade FormStyle do Form para fsStayOnTop. Está igual ao seu exemplo o form do teclado! Acho que o problema está na forma como está sendo chamado o form do teclado no botão...

    ResponderExcluir
    Respostas
    1. Boa noite!

      Me desculpe pela demora para responder. Faz muito tempo que não mexo com Delphi, tentei pesquisar na Internet, porém não consegui encontrar uma maneira simples de resolver isso, achei esse link https://www.codeproject.com/Questions/751002/Show-Window-without-activating, talvez manipulando as mensagens você consiga fazer o que quer.

      Fiz alguns testes aqui, vi que o forms só não fica sem o foco se você tentar utilizar ele no forms que o chamou, porém se tentar utilizar em outra janela fora da aplicação, funciona, o que você pode tentar fazer é:

      1 - Criar um projeto com seu teclado virtual, depois de terminado, você gera um executável (tecladovirtual.exe, por exemplo).

      2 - Criar um novo projeto, criar seu forms que irá chamar o teclado virtual, porém ao invés de fazer um frmTecladoVirtual.Show você faria WinExec('tecladovirtual.exe', SW_SHOW).

      Se a opção acima não te atender, infelizmente não poderei te ajudar.

      Excluir