GARANTIR DESCONTO

Fórum Teclado Virtual #363665

10/09/2008

0

Olá, estou tentando implementar um teclado virtual parecido com o do windows. Só que quando eu clico nos botões do form ( que correspondem as letras) a outra aplicação perde o focus.


até mais


Tresloukadu

Tresloukadu

Responder

Posts

10/09/2008

Wdrocha

Cara.....não é tao simples assim...

vc tem q fazer mt coisa....

Começando a mudar a propriedade FormStyle do seu form para fsStayOnTop para q ele fique sempre em primeiro plano...


Eu tow fazendo um e fiz assim....

Eu criei uma procedure q fica interceptando os cliques do mouse....e o lugar q foi clicado por último eu pego o endereço dele na memória...e qdo o usuário clica em uma tecla....eu mando uma mensagem para ele através da função SendMessage da API do Windows....

Deu um trabalhão...

Eu postei mt dúvida no fórum....

vc vai encontrar mts respostas...

me ajudaram mt aq...


Procura pelo tópico...

[b:ddfa3a6c6c]PostMessage para o programa em execução[/b:ddfa3a6c6c]


espero ter ajudado....


Qualquer coisa...posta aew...


Flw


Responder

Gostei + 0

10/09/2008

Tresloukadu

Poxa o seu exemplo ajudou mesmo, pois eu já estava quase desanimando. Eu tentei colocar para os caracters irem pra frente e eles não foram.

tirei essa linha keybd_event(37, 0, 0, 0);

e o dados foram sobrescritos, mas se eu deixo ele coloca os caracters para trás e não pela frente.


Ai eu pensei ´ a só colocar o codigo asccii do caracter pra frente, mas não rolou ´. Eu consultei a tabela ascii http://www.tacktech.com/display.cfm?ttid=27 e o caracter que você utiliza é o ´ ¬ ´ isso que me deixou itrigado, porque o uso do ´ ¬ ´ ? Nesse caso não era pra aparecer o sinal de porcentagem ao invés de colocar o cursor para trás?


Responder

Gostei + 0

10/09/2008

Wdrocha

Pois é.....


Tah um pouco desatualizado...


vc tem q fazer o seguinte....


Na hora d enviar a mensagem para o programa q vc quer enviar a letra...


Var teclas : TkeyBoardState;

Begin

GetKeyBoardState(Teclas);

 If (Teclas[VK_SHIFT] = 1) Then // Se o estado da tecla Shift seja True

              Begin

                 KeyBd_Event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or 0, 0); // Segura Shift

                 KeyBd_Event(VkKeyScan (Letra), 0, KEYEVENTF_EXTENDEDKEY, 0); //Esta linha e a subsequente seguram e soltam a letra desejada

                 KeyBd_Event(VkKeyScan (Letra), 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);

                 KeyBd_Event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); //Solta Shift

              End

           Else // Caso o estado da tecla Shift seja falso

              Begin

                 KeyBd_Event(VkKeyScan (Letra), 0, KEYEVENTF_EXTENDEDKEY, 0);

                 KeyBd_Event(VkKeyScan (Letra), 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);

              End;

        End;
End;


como disse pra vc...

não vai ser nada fácil...

tem q ler mts tutos pela net....


Eu ainda tow dessenvolvendo...mas essa parte de enviar os caracteres eu já resolvi....


Essa é uma pequena parte do código....

vai t ajudar mt...

Qualquer coisa...posta aew...

Flw....


Responder

Gostei + 0

10/09/2008

Wdrocha

Ah..mais uma coisa...


sobre os caracteres serem sobrescritos....é por causa do tipo de componente que vc tah querendo enviar a mensagem...

por isso eu disse q tem q pegar o endereço do mesmo na memória....

e verificar se é um Edit....pois este componente vc tem q dar uma seta para o lado para q ele não sobrescreva o valor do campo...


vc tem q usar uma HookProcedure.....só assim q eu consegui....

para os outros componentes geralmente não precisa....pelo menos...não tive problemas com eles até agora....

a função q enviei vai t ajudar ....mas não com campos do tipo Edit...

Fica aew a dica....


Flw....


Responder

Gostei + 0

12/09/2008

Tresloukadu

Cara muito obrigado pela força, pois eu estava muito perdido com isso tudo. Pois sou novato ainda no delphi faz uns 2 meses que comecei a mexer. E to cançado de fazer calculadoras hehe :P

Bom como você disse que está desenvolvendo o teclado ainda, vou postar a dica aqui do comentário de um outro forum que estou participando, onde tem um cara que desenvolveu um super teclado virtual. Pois axo que o que ele disse vai ser útil para você, assim como foi para mim:


Once I had to write a commercial Virtual Keyboard component with dynamic layout design, word prediction, abbreviation support, and some other fancy (or maybe stupid) features. First it was sounding simple but took one full month to get functional. Here is a list of things that I remember and you have to consider while developing your virtual keyboard: * You should reset toggling keys (e.g. shift, ctrl, alt, ...) before sending a key, and the restore them back. * Not only you have to send a pressed key, but also you have to release it. * For character keys should to use WM_CHAR message and only its unicode version on NT, XP, and Vista. For other keys you should use SendInput. * GetFocus and GetActiveWindow return valid values for current process only. You should either attach to other processes´ input queue or call GetGUIThreadInfo. * Don´t forget to manage dead keys, which is the most difficult part in my opinion. Do not know what is a dead key? Google it! Smile * Before sending and key/character to another process, you should wait for the process to be ready. * Use scan codes to determine actual VKey or Character pressed. * Notice that actual character of a scan code depends on the selected keyboard layout (language) selected by the user. Good luck!



Você pode acompanhar nesse link

[url] http://forum.delphiarea.com/viewtopic.php?p=5391 [/url]


agora que estou mais tranquilo de tempo, vou testar as suas dicas.


keep in touch... t+


Responder

Gostei + 0

12/09/2008

Wdrocha

Bom dia.....obrigado pela dica.....


como eu disse pra vc...


O tópico que indiquei a vc....está desatualizado em relação ao q eu já fiz...mas será d grande ajuda para vc....


Dá uma olhada no site do Torrys Delphi.....

lá tem mts exemplos sobre hookprocedure....


procura por [b:d90c3f7929]Interceptar clicks do mouse[/b:d90c3f7929]...

Aew d lá....
vc terá uma base de como interceptar os clicks e verificar qual o tipo de componente que foi clicado através da posição do cursor na hora do click....

Depois q vc conseguir fazer isso...


aew tudo ficará mt mais fácil.....


Eu tow fazendo agora a parte do AutoComplete....


por exemplo....


eu tenho um banco com mais d cem mil palavras...


qdo o usuário vai digitando as letras.....


eu vou mostrando uma lista com as palavras mais usadas com as letras q ele já digitou....


e vou montando um ranking com as mais usadas q serão as que mais aparecerão nas sugestões...


exemplo...


se vc digitar ´A´ ele me traz as palavras mais usadas que começam com a

letra ´A´...se vc digitar...´AB´ ele faz ma mesma coisa....e assim

sucessivamente....e qdo vc clica na palavra q vc quer....ele completa pra

vc....


Espero estar sendo útil....



Bom dia para vc..


qualquer coisa...posta aew...



flw...


Responder

Gostei + 0

12/09/2008

Tresloukadu

Olá,

Eu estive fazendo um teste com a rotina sndkey32.pas [url] http://www.delphi3000.com/articles/article_1617.asp?SK= [/url] e funcionou legal, na sua opinião você acha que seria necessário utilizar esta routina?
Mas com ela o problema no edit também dá ¬¬ , ainda não implementei a solução que você deu. Assim que eu fizer eu vou expor aqui as minhas impressões e dificuldades.

Aquele código que você passou do shift funcionou aqui, e foi muito bom pois me deixou atento a outras coisas que eu não estava pensando ( como o botão shift e o caps lock px. ).


Responder

Gostei + 0

12/09/2008

Wdrocha

Não tem problema algum em usar esta rotina....


eu uso uma rotina parecida q eu fiz....faz a mesma coisa q ela....


qdo vc começar a implementar a solução do tipo d componente....

eu darei uma força.... :D

me deu um trabalhão....


eu fiquei umas 3 semanas só nisso....

só não desisti pq....é pra empresa em q trabalho....

se desistisse....pegaria a conta.....hauhauha....

Qualquer coisa....

posta aew d novo....


e se encontrar algo novo....q nos seja util e aos colegas do fórum...


não esquece d postar....tbm quero aprender.... :D


Bom fds.....


Responder

Gostei + 0

16/09/2008

Tresloukadu

Cara esse seu códgio



Procedure TFrmTecladoReduzido.BtAClick(Sender: TObject);

Begin

Application.HandleMessage;

MyHandle := FindWindow(´TFrmTecladoReduzido´, Nil);

If (GetActiveWindow = MyHandle) Then

HandleMaeFocus := GetNextWindow(MyHandle, GW_HWNDNEXT);

Sendmessage (HandleFilhaFocus, WM_SETFOCUS, 0, 0);

SetActiveWindow (HandleFilhaFocus);

keybd_event(37, 0, 0, 0);//Caso esteja digitando no browser

keybd_event(65, 0, 0, 0);//Código ascii da letra A

End; 





Eu só alterei umas coisinhas neles e ficou pracas segue a versão altered


//============================================================================//
procedure TForm2.processLetter(letra: char);
//============================================================================//
var
  layoutKeyboard : HKL;
  Key            : integer;
begin
   
  //Interrompe a aplicacao para que o windows possa processar as mensagens.
  Application.HandleMessage;

  //Handle da janela do teclado
  MyHandle := FindWindow(´TForm2´,nil);

  if GetActiveWindow = MyHandle then
    HandleMaeFocus := GetNextWindow(MyHandle,GW_HWNDNEXT);


  Sendmessage(HandleFilhaFocus,WM_SETFOCUS,0,0);
  SetActiveWindow(HandleFilhaFocus);
  
  layoutKeyboard := GetKeyboardLayout(0);

  Key := VkKeyScanEx(letra,layoutKeyboard);
  
  //Caso seja um edit prepara o cursor
  keybd_event(39, 0, 0, 0);
  keybd_event(39, 0, KEYEVENTF_KEYUP, 0);
  
  keybd_event(LoByte(Key), 0, 0, 0);
  keybd_event(LoByte(Key), 0, KEYEVENTF_KEYUP, 0);
   

end;




Como você poder ver o problema de colocar a seta para a esquerda foi resolvido ... colocando ela para direita ... serio .. eu troquei eu troquei o valor 37 (seta esquerda) pelo 39 (seta direita) e o problme do edit ficou resolvido .... Esse código precisa dar uma melhorada ainda, mas funciona muito bem .. outra coisa que acrescentei nele foi o release da tecla.

A única coisa que não gostei foi o efeito visual de perder e ganhar o foco toda ora ... parece que fica piscando .... qual a solução que voce utilizou para isso ?


até mais


Responder

Gostei + 0

17/09/2008

Wdrocha

Olá...bom dia....


vc já testou a sua função em um teclado q não seja ABNT2??

Eu fiz uns testes....meu teclado não é ABNT2....vc terá os mesmos problemas q eu tive....por exemplo....com a letra ´Ç´,nos testes q eu fiz aq....ao invés deste caracter aparece uma vírgula....


com caracteres deste tipo vc precisa segurar alt + número da letra....

entende???

Por exemplo... Alt + 135 = ç

E qto ao teclado ficar piscando...eu deixei essa parte para o final.....

eu imagino q tenha q criar uma thread....se vc observar o teclado do Windows...o mesmo não recebe focus em mom algum....é o q pretendo fazer com a thread...


se vc quiser....eu posto o código para q vc simule o alt....



Flw...


Responder

Gostei + 0

22/09/2008

Tresloukadu

Olá amigo,

Como estou querendo fazer um teclado que funcione em um touchscreen eu sempre vou ter certeza que será ABNT2. Por isso eu tenho uma tecla só de ´ç´ ( isso por motivos de acessibilidade também, pois é mais facil pra digitar na tela).

Nesse caso eu envio o ´ ç ´ e funciona na boa. No seu caso (nao sei se estou falando besteira) mas no seu caso eu faria o seguinte: Usaria o metodo GetKeyboardLayout(0) para pegar o layout original do seu teclado e armazenar numa variavel. Depois eu utilizaria o metodo LoadKeyboardLayout para carregar layout do teclado da ABNT 2. Ao final do processo eu restauraria o layout antigo com o mesmo metodo LoadKeyboardLayout .... Axo que com isso funcionaria.


Com relação ao uso do ALT e do numero ascii ( Alt + 135 = ç ) eu tentei fazer e não funcionou. Eu tentei utilizar o alt de varias formas pois precisava simular o pressionamento das teclas ´ * ´ , ´ $ ´ , ´ # ´ e com o alt nao rolou. Então eu decidi utilizar o scanCode e com o scanCode funcionou muito bem. A tabela com o scanCode está nesse link

http://www.delphipages.com/threads/thread.cfm?ID=167269&G=167246

Ai eu fiz uma procedure como essa:



{Faz o simbolo do dolar}
//============================================================================//
procedure TForm2.SpeedButton20Click(Sender: TObject);
//============================================================================//
begin

  //Trata o foco das janelas.
  trataJanelas;
  
  //Caso seja um edit prepara o cursor
  keybd_event(39, 0, 0, 0);
  keybd_event(39, 0, KEYEVENTF_KEYUP, 0);
  
  //Segura o Shift
  keybd_event(VK_SHIFT, 0, 0, 0);
  
  //Processa o valor da tecla baseado no scanCode.
  keybd_event(52, 0, 0, 0);
  keybd_event(52, 0, KEYEVENTF_KEYUP, 0);

  //Solta o shift
  keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);

end;

[quote]


Com esse método funcionou legal, vc precisa procurar o scanCode do ç nao sei se há.  

No meu caso para eu printar o " ç " na tela faço do seguinte modo: 


[/quote]

{Evia a letra informada para aplicação em questão}
//============================================================================//
procedure TForm2.processLetter(letra: char);
//============================================================================//
var
  layoutKeyboard : HKL;
  Key            : integer;
begin
  
  //Trata o foco das janelas.
  trataJanelas;


  ///*****FAZER O TRATAAMENTO DO SHIT AQUI******///
 // if shiftState = true then  


  layoutKeyboard := GetKeyboardLayout(0);

  Key := VkKeyScanEx(letra,layoutKeyboard);

  //Caso seja um edit prepara o cursor
  keybd_event(39, 0, 0, 0);
  keybd_event(39, 0, KEYEVENTF_KEYUP, 0);
  
  keybd_event(LoByte(Key), 0, 0, 0);
  keybd_event(LoByte(Key), 0, KEYEVENTF_KEYUP, 0);


  //*** SOLTAR O SHIFT AQUI ***//

  
end;




para enviar o ç chamo no onclick do botão por exemplo: processLetter(´ç´);



Agora vou começar a fazer o shift e a ancentuação gráfica.

Se você puder postar ai como fez para a tela parar de piscar eu agradeço....

até mais!!


Responder

Gostei + 0

22/09/2008

Tresloukadu

Outra coisa, eu axei as dicas nesse site interessante

http://www.festra.com/wwwboard/messages/1687.html

comigo não funcionaram, mas os toques que eles deram me deram umas iéias boas... talvez ajude vc tb.

fallow


Responder

Gostei + 0

22/09/2008

Wdrocha

Eu acho melhor usando o mapa de caracteres do Windows....qdo vc carrega o layoyt ABNT2 vc está se arriscando a dizer q na máquina do usuário tem este layout...e se o usuário apagar ????

isso geraria um erro....Por isso eu acho melhor simular o Alt....é mais seguro....Vc estará acessando o Mapa de Caracteres do Windows...se vc quiser...eu posto como fiz....


e qto a parar d piscar.....ainda não fiz....

vou deixar para o final...


Qualquer coisa posta aew...


e qto ao uso do Ord no link q vc me sugeriu ele retorna o número ascii da letra....por isso não serve pra nós dois....


Flw....


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar