Usando a API do windows podemos executar um programa externo, colocar a janela dele dentro da janela do nosso programa e capturar texto de uma janela ou widget qualquer desse programa.
Qualquer programa feito e usando a api do windows pode ser usado dessa forma. Nossa cobaia oficial será a calculadora do windows, mas onde você ver calculadora pode ler "qualquer programa nativo win32, como msn, bloco de notas etc".
O exemplo foi feito em lazarus mas funciona perfeitamente em qualquer versão do Delphi. Tenha a unit Windows no seu uses.
procedure TForm1.btCapturarClaculadoraClick(Sender: TObject);
var
//vamos dar apenas 5 tentativas pois pode ser que a "calculadora" não existe
tentativas: integer;
HandleCalc, HandleCaixaTexto: HWND; //handles da calculatora
TamanhoVisor: integer;
TextoVisor: string;
begin
//executamos a "calculadora" ou qualquer que seja o programa externo
ShellExecute(Handle, nil, 'c:\windows\system32\calc.exe', nil, nil, SW_SHOWNORMAL);
//enquanto não encontrarmos a janela do programa externo DENTRO da janela do nosso programa ou não for atingido o núimero de tentativas nós tentaremos colocar a janela do programa "calculadora" dentro da nossa janela
while (FindWindowEx(Handle, 0, 'SciCalc', 'Calculadora') = 0) or (tentativas < 5) do
begin
//FindWindowEx procura uma janela dentro de outra e FindWindow apenas procura uma janela
HandleCalc:= FindWindow('SciCalc', 'Calculadora');
Windows.SetParent(HandleCalc, Handle);
Inc(tentativas);
//um sleep para dar uma pausa de 1 ms
Sleep(1);
end;
if HandleCalc > 0 then
begin
//obtem o primeiro filho da janela da calculadora
HandleCaixaTexto := GetWindow(HandleCalc, GW_CHILD);
//obtem o tamanho do texto na caixa
TamanhoVisor:=SendMessage(HandleCaixaTexto, WM_GETTEXTLENGTH, 0, 0) + SizeOf(Char)*1;
//seta o tamanho desse texto
SetLength(TextoVisor, TamanhoVisor);
//obtem o texto gravando-o em TextoVisor. Integer(TextoVisor) é o mesmo que o endereço do array onde estão os chars da string
SendMessage(HandleCaixaTexto, WM_GETTEXT, TamanhoVisor, Integer(TextoVisor));
//mostraremos o texto da calculadora, como está recém iniciada será 0
ShowMessage(Trim(TextoVisor));
end;
end;
Lembre-se que fechar seu programa não fechará a "calculadora" que está aberta. Para isso você deve fechar a calculadora antes ou fechá-la no gerenciador de tarefas.
Em um outro post veremos como podemos gerenciar e fechar tarefas usando a API do windows.
Have fun :)
Comentários
Postar um comentário