Fórum Como (via código) acessar um objeto de outro EXE?? #367931
26/01/2009
0
Estou precisando muito de uma solução (via API do Windows) que funcione tanto para Windows XP como para o Vista. Seguinte, meu programa precisa (via código Delphi) acessar um botão para que ele fique com o FOCO e depois simular ENTER ou enviar o click do mouse nele. Este botão pode ser o da calculadora do Windows (como exemplo).
Agradeço qualquer ajuda.
Onjahyr
Curtir tópico
+ 0Posts
26/01/2009
Rpdesign
se o programa que vc quer mexer for um programa de um empresa grande como microsoft ou sun geralmente os programas aceitam comandos esternos executados tipo assim:
programa.exe -e -a -m commando /a
isso permite executar operacoes no momento em qu vc abre o programa, dai vc pode usar oi shellexecute ou o winexec para executar.
ja ouvi falar em programas para teste de software que identificam os objetos por nome e simulam o uso deles em carater de testes, eles ´grvam´ as operacoes do usuario e executam igual depois, sem o uso de coordenadas, se voce descobrir como esse sprogramas funcionam pode tentar fazer igual... vou procurar mais informacoes sobre isso, se eu achar posto aqui
flw
Gostei + 0
26/01/2009
Onjahyr
procedure TForm1.Button1Click(Sender: TObject);
Var
h: Thandle;
s : string;
i: Integer;
begin
h := FindWindow(´SciCalc´, Nil);
h := getwindow(h, GW_CHILD);
i := SendMessage(h, WM_GETTEXTLENGTH, 0, 0) + 1;
setLength(s, i);
SendMessage(h, WM_GETTEXT, i, Integer(s));
s := trim(s);
Edit1.Text := s;
end;
---------------------------------------------------------
Eu sei que é possível fazer isso com qualquer programa, e, através de outro programa, pode-se pegar os nomes dos componentes, a classe, etc.. passando o mouse por cima de um objeto, depois pega-se o valor e usa no código do programa, mas não sei o processo de enviar o foco (no outro programa).... meio enrolado o q escrevi, mas o fundamento você já entendeu!!!
Gostei + 0
27/01/2009
Bacalhau
Por acaso é possivel manipular objectos dentro de outras aplicações, sem o recurso a um milagre.
Por motivos de protecção de código-fonte não posso colocar aqui a solução, mas posso dar umas pistas:
Utiliza as funções GetPosition e FindClass e SendMessage do API do Windows. A função SendMessage é bastante complexa quanto aos parâmetros a enviar, a própria Microsoft não tem uma documentação completa sobre o assunto.
Assim sugiro uma ida ao MSDN, que cataloga os parâmetros do SendMessage por tipo de objecto (Buttons, ListBox, etc)
É necessário também dominar um pouco de C++, já que a sintaxe e tipos de dados destas funções estão - naturalmente - desenvolvidas nesta linguagem
Espero ter ajudado
nota: utilizo esta técnica num software ERP que integra objectos 3D Studio Max com bases de dados MySQL
Gostei + 0
27/01/2009
Onjahyr
Estou tendo ajuda de alguns companheiros em outros fóruns e listas.
No Google consegui fazer algumas coisas interessantes com o [b:7df8b1f0de]´SendMessage()´[/b:7df8b1f0de]
[i:7df8b1f0de]SendMessage(lp, WM_COMMAND, (BN_CLICKED shl 8) + 1, hChild);[/i:7df8b1f0de]
De qualquer forma eu agradeço pelas idéias...
Gostei + 0
27/01/2009
Onjahyr
Gostei + 0
28/01/2009
Onjahyr
Estou com um problema, bacalhau, se você souber algo me dá uma instrução. é referente a como marcar um TRadioButton, fiz com o SendMessage, em vez de colocar [b:177b361a80]BM_CLICK[/b:177b361a80] eu coloquei [b:177b361a80]BM_SETCHECK[/b:177b361a80], mas não funciona, era para funcionar, mas não funciona...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)