Fórum Como (via código) acessar um objeto de outro EXE?? #367931

26/01/2009

0

Pessoal, boa tarde a todos.

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

Onjahyr

Responder

Posts

26/01/2009

Rpdesign

Cara vc ta quase querendo milagre, pra comecar, vc tem que saber muitos detalhes so0bre a aplicacao que vc vai manipular, vc poderia simular click do mouse mais para isso vc precisaria das coordenadas exatas do botao, se o programa abrir mais pro lado na maquina do cliente ja nao da certo.

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


Responder

Gostei + 0

26/01/2009

Onjahyr

Fico grato se vc descobrir algo. Eu tenho como pegar o resultado de um cálculo feito na calculadora do windows:

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


Responder

Gostei + 0

27/01/2009

Bacalhau

Boa tarde, é a primeira vez que respondo aqui passados muitos anos :D

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


Responder

Gostei + 0

27/01/2009

Onjahyr

É, graças ao Google eu já vi isso!
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...


Responder

Gostei + 0

27/01/2009

Onjahyr

onde se vê o smille é porque contém o número 8 e em seguida fecha parêntese ´)´, se juntar os dois forma o smille 8)


Responder

Gostei + 0

28/01/2009

Onjahyr

Estou conseguindo, :lol:

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


Responder

Gostei + 0

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

Aceitar