- 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.
Google Docs
Não se esqueça de liberar uma tecla após pressioná-la.
Tabela ASCII
Tabela Virtual Key
http://www.devmedia.com.br/forum/viewtopic.asp?id=367715
Parabéns Mateus! Um belo exemplo de controle de teclas e funções do Delphi.
ResponderExcluirObrigado!
ExcluirBoa tarde.
ResponderExcluirMuito 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.
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!
ExcluirOlá 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...
ResponderExcluirBoa noite!
ExcluirMe 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.