PostMessage Para o programa em execução

18/07/2008

0

Bom dia pessoal...


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

Wdrocha

Responder

Posts

18/07/2008

Wdrocha

esqueci de dizer q...


estou usando um teclado virtual q estou desenvolvendo...


vlw


Responder

18/07/2008

Nildo

Olá.

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


Responder

18/07/2008

Wdrocha

Nildo....fiz como vc mandou e o código ficou assim...

//******************************************************************************
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...


Responder

18/07/2008

Nildo

Bom, é o seguinte... O WM_SETTEXT altera o Caption da janela. O keybd_event simula o pressionamento de uma tecla. Logo, você deve antes de enviar o keybd_event, dar um SetForegroundWindow da janela que você quer enviar a tecla.

Dessa maneira a tecla será enviada para a janela que estará ativa. Então brinque com essas APIs: SetForegroundWindow, FindWindow e Keybd_event


Responder

18/07/2008

Wdrocha

Eu fiz o q vc falow...mas...


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:


Responder

18/07/2008

Nildo

Tá quase la. Mas assim, você declarou a variavel la como THandle, mas você não atribuiu nada a ela!


Responder

18/07/2008

Wdrocha

Pow cara consegui....

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....


Responder

18/07/2008

Nildo

De alguma maneira o botãozinho do windows do teclado ta apertado. Não fisicamente mas o SO ta interpretando como tal. Olhe na SDK do windows os parâmetros da keybd_event. Se eu não me engano depois que vc da o sinal que você apertou uma tecla, tem que mandar o sinal de que você soltou a tecla. E isso você indica nos parâmetros.


Responder

18/07/2008

Wdrocha

Vlw cara....eu vou procurar....


Mt obrigado pela ajuda....


Mt grato a vc....


Vlw....



Abraços,



Williame Rocha


Responder

18/07/2008

Nildo

Estamos ai!


Responder

21/07/2008

Wdrocha

Como eu faço pra pegar o handle de uma janela através do click do mouse???


Responder

21/07/2008

Nildo

Como assim? Você quer clicar em um local da janela e pegar o handle desse local?


Responder

21/07/2008

Wdrocha

Sim...olha o q tah acontecendo Nildo....


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.....


Responder

21/07/2008

Nildo

É. Ele envia a mensagem para o que for que esteja em foco. Por isso voce tem que se certificar que você está enviando para o controle que está em foco.

Um bom comećo seria estudar esta página: http://www.codeproject.com/KB/winsdk/hwndfrommouseclick.aspx


Responder

21/07/2008

Wdrocha

esqueci d falar q....


ele só escreve a primeira letra no firefox, por exemplo....e depois não escreve mais.....


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar