Fórum Teclado Virtual #363665
10/09/2008
0
até mais
Tresloukadu
Curtir tópico
+ 0Posts
10/09/2008
Wdrocha
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
Gostei + 0
10/09/2008
Tresloukadu
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?
Gostei + 0
10/09/2008
Wdrocha
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....
Gostei + 0
10/09/2008
Wdrocha
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....
Gostei + 0
12/09/2008
Tresloukadu
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:
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+
Gostei + 0
12/09/2008
Wdrocha
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...
Gostei + 0
12/09/2008
Tresloukadu
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. ).
Gostei + 0
12/09/2008
Wdrocha
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.....
Gostei + 0
16/09/2008
Tresloukadu
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
Gostei + 0
17/09/2008
Wdrocha
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...
Gostei + 0
22/09/2008
Tresloukadu
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!!
Gostei + 0
22/09/2008
Tresloukadu
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
Gostei + 0
22/09/2008
Wdrocha
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....
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)