Truques usando API do windows

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

Postagens mais visitadas deste blog

Detectar o encoding de um arquivo para não corromper ao transformá-lo

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Quebras de linha no Delphi 2010