PostMessage Para o programa em execução
18/07/2008
0
estou aq d novo com mais uma dúvida...
Eu estou tentando enviar um caracter para um programa em execução usando o PostMessage...
Por exemplo, estou testando com o Word 2003, Windows Vista e D7...
mas ele não envia o caracter q eu mando....
estou usando o seguinte código..
//******************************************************************************
Procedure TForm1.BtCedilhaClick(Sender: TObject);
Var MyHandle : THandle;
Begin
MyHandle:= FindWindow(´Opusapp´, Pchar(´Documento1 - Microsoft Word´));
If MyHandle <> 0 then
Begin
PostMessage( myHandle, WM_SETFOCUS, 0, 0);
PostMessage( myHandle, WM_KEYDOWN, 65, 0);
End;
End;
//******************************************************************************
Ele até envia o setFocus...mas não escreve o caracter 65 q é o A...
O q eu pretendo depois q conseguir enviar para o Word, seria pegar qual janela está com o focus na tela e enviar para aquela q estiver com o focus. Enviar caracter para o browser por exemplo, independente de ser o Firefox(q na minha opnião é o melhor) ou o IE.
Alguém tem uma idéia???
Vlw...
Wdrocha
Posts
18/07/2008
Wdrocha
estou usando um teclado virtual q estou desenvolvendo...
vlw
18/07/2008
Nildo
Após colocar foco na janela, tente usar a função
keybd_event( [codigo da tecla], 0, 0, 0 );
Faz um tempinho que não programo com Delphi então estou um pouco enferrujado
18/07/2008
Wdrocha
//******************************************************************************
Procedure TForm1.BtCedilhaClick(Sender: TObject);
Var MyHandle : THandle;
Begin
MyHandle := FindWindow(´OpusApp´, nil);
//MyHandle := Getwindow(MyHandle,GW_CHILD);
If (MyHandle <> 0) then
Begin
PostMessage( myHandle, WM_SETFOCUS, 0, 0);
keybd_event( 65, 0, 0, 0 );
SendMessage(MyHandle, WM_SETTEXT, 0, Integer(PChar(´Williame Rocha´)));
End;
End;
//******************************************************************************
Se eu deixar a segunda linha comentada....ele muda o título do documento....Se eu descomentar a segunda linha....ele não faz nada...
o q eu sei q tenho q fazer e não sei como, é pegar o handle da janela filha....ou a última janela q esteve com o focus pra assim poder enviar os caracteres....Ele está enviando para a janela mãe...
Eu pus o código q vc indicou mas...ele escreve a letra no próprio delphi...
Vc tem mais alguma idéia??
Vlw...
18/07/2008
Nildo
Dessa maneira a tecla será enviada para a janela que estará ativa. Então brinque com essas APIs: SetForegroundWindow, FindWindow e Keybd_event
18/07/2008
Wdrocha
Acontece o seguinte....
Ele só escreve se estiver no modo debug....qdo eu clico no botão para enviar o SenMessage e aperto rapidamente na tecla F9 ele escreve no Word
mas só escreve uma vez.....nas outras vezes ele escreve no form...
Eu fiz um teste e a partir da segunda vez usando o SETTEXT, foi pra saber em qual janela estava o focus ele muda o caption do form.... O código ficou assim Nildo...
//***********************************************************
Procedure TForm1.Button1Click(Sender: TObject);
Var Handle : THandle;
Begin
If Handle <> 0 Then
Begin
SendMessage (Handle, WM_SETFOCUS, 0, 0);
SetForegroundWindow(Handle);
KeyBd_Event (67, 0,0,0);
SendMessage(Handle, WM_SETTEXT, 0, Integer(Pchar(´Williame Rocha´)));
End;
End;
//***********************************************************
Falta pouco.....rsrsr
Vlw....alguma luz?? javascript:emoticon(´:lol:´)
:lol:
18/07/2008
Nildo
18/07/2008
Wdrocha
Vlw mesmo...
O código ficou assim....
//******************************************************************************
Procedure TForm1.Button1Click(Sender: TObject);
Begin
Handle := FindWindow(´OpusApp´, Nil);//Variavel Global pra não perder o focus da janela
Ax := Handle;//Variavel Global, guarda o handle da janela mâe
Handle := GetWindow (Handle, GW_CHILD);//Pega o handle da janela filha
If Handle <> 0 Then
Begin
SendMessage (Handle, WM_SETFOCUS, 0, 0);
SetForegroundWindow(Handle);
KeyBd_Event (70, 0,0,0);
End;
SendMessage(ax, WM_SETFOCUS, 0, 0);//Devolve o focus a janela mãe
End;
//******************************************************************************
Agora tem outras coisas que eu preciso fazer...
Certas horas o SO fica maluco....qdo eu clico na tecla da letra q eu quero enviar, por exemplo, ele chama a janela de pesquisa do Windows....outra hora ele abre o Windows Explorer....rsrsrs...
Aew eu tenho q reiniciar a maq....
ma isso é o d menos.....
O q me interessa agora...
é como saber qual janela está com o focus.....independente de ser o Word, Firefox e etc....e enviar o caracter para a janela q estiver com o focus
Tem como ??
Vlw....
Mt Obrigado por está me ajudando....
qdo o teclado estiver pronto eu vou disponibilizar aq pra quem quiser....
18/07/2008
Nildo
18/07/2008
Wdrocha
Mt obrigado pela ajuda....
Mt grato a vc....
Vlw....
Abraços,
Williame Rocha
21/07/2008
Wdrocha
21/07/2008
Nildo
21/07/2008
Wdrocha
Eu alterei o código para q ele envie mensagem para qualquer lugar q aceite texto...
mas ele tah pegando o handle do botão q eu tow clicando....e tah enviando a mensagem pro botão....
o firefox tah rolando atrás dele por exemplo....é pra ele q deveria ser a letra enviada e não pro botão q eu cliquei.....
21/07/2008
Nildo
Um bom comećo seria estudar esta página: http://www.codeproject.com/KB/winsdk/hwndfrommouseclick.aspx
21/07/2008
Wdrocha
ele só escreve a primeira letra no firefox, por exemplo....e depois não escreve mais.....
Clique aqui para fazer login e interagir na Comunidade :)