Esse artigo faz parte da revista Clube Delphi Edição 60. Clique aqui para ler todos os artigos desta edição

  result.Height := Screen.Height;

  dc := GetDc(0);

  cv := TCanvas.Create;

  cv.Handle := DC;

  result.Canvas.CopyRect(Rect(

    0, 0,Screen.Width,Screen.Height),

    cv,Rect(0,0,Screen.Width, Screen.Height));

   cv.Free;

   ReleaseDC (0, DC);

end;

{ Exemplos de utilização }

{ Captura a tela e salva para o disco }

CapturaTela.SaveToFile('tela.bmp');

{ Exibe a tela em um componente Image }

Image1.Picture.Assign(CapturaTela);

 

2. Capturando a imagem da tela (screen-shot) de uma máquina da rede

GP - Esse recurso é bastante utilizado por aplicações estilo “trojan”, permitindo que o intruso possa observar o que a pessoa na outra máquina está fazendo. Deixando o hackerismo de lado, um exemplo prático da técnica é monitorar remotamente a ação de usuários na sua aplicação. Por exemplo, é muito comum utilizar esse recurso em programas que controlam lan-houses, ou aplicações estilo PcAnywhere ou Terminal Services. A idéia é simples, construímos duas aplicações que trocam imagens através de sockets, usando streams.

O primeiro passo é construir a aplicação servidora, que deve ficar em execução em todas as máquinas a serem monitoradas. Em uma nova aplicação VCL, coloque no formulário um IdTCPServer da Indy. Configure seu DefaultPort para 8090 e Active para True. No seu evento OnExecute digite o código da Listagem 2. Observe que fazemos uso da rotina CapturaTela, mostrada no exemplo anterior. Na aplicação cliente, coloque um IdTCPClient da Indy e defina a propriedade Port como 8090. Coloque um Image, um Edit e um Button. No evento OnClick do Button digite o código da Listagem 3. Você pode colocar um Timer e chamar o mesmo código, se quiser que a imagem seja atualizada constantemente. Ao clicar no botão, a imagem mostrará a tela do computador indicado no Edit (digite o endereço IP ou o nome da máquina).

 

Listagem 2. Servidor captura tela da máquina e envia pela rede

procedure TForm1.IdTCPServerExecute(

  AThread: TIdPeerThread);

var

  Stm : TStream;

  Tela: TBitmap;

  cmd: string;

  fn: string;

  r: integer;

begin

  randomize;

  r := Random(MaxInt);

  fn := Format('tela%d.bmp',[r]);

  cmd := AThread.Connection.ReadLn;

  if pos('TELA',cmd) > 0 then

  begin

    Tela := CapturaTela;

    Tela.SaveToFile(fn);

    Tela.Free;

    Stm := TFileStream.Create(fn,

      fmOpenRead + fmShareDenyNone);

    AThread.Connection.OpenWriteBuffer;

    AThread.Connection.WriteStream(Stm);

    AThread.Connection.CloseWriteBuffer;

    FreeAndNil(Stm);

  end;

AThread.Connection.Disconnect;

end;

 

Listagem 3. Aplicação monitora terminais remotamente

procedure TForm1.Button1Click(Sender: TObject);

var

  Stm: TStream;

begin

  IdTCPClient1.Host := Edit1.Text;

  IdTCPClient1.Connect;

  WriteLn('TELA');

  Stm := TFileStream.Create('tela.bmp',fmCreate);

  try

    while IdTCPClient1.Connected do

      IdTCPClient1.ReadStream(Stm,-1,true);

  except

  end;

FreeAndNil(Stm);

Image1.Picture.LoadFromFile('tela.bmp');

end;

 

3. Obtendo dados da Web a partir de uma aplicação Delphi

GP - Hoje em dia, é muito comum sua aplicação precisar de informações ou utilizar serviços disponibilizados por outra aplicação. Não é para menos que surgiram os Web Services. Com essa tecnologia, podemos incluir em nossas aplicações serviços oferecidos por outras empresas. Por exemplo, você pode ter um sistema de controle de estoque que, dada a falta de um determinado produto, conecta-se automaticamente aos fornecedores através de Web Services e pesquisa pela disponibilidade do produto, pelo melhor preço e já faz a encomenda automaticamente.

Porém, a realidade nos mostra que, muitos serviços na Web estão somente disponíveis para acesso via browser. Ou seja, para usar o serviço, é preciso abrir um browser, conectar no site da empresa e usar seu serviço (exemplos: envio de mensagem para celular, consulta à lista telefônica, consulta ao CPF etc.). Uma saída é fazer a requisição “no braço”.

É justamente o que mostrarei aqui. A idéia é simples: montamos uma requisição HTTP (como se nossa aplicação fosse um browser), enviamos a solicitação ao site desejado, obtemos a página de retorno e fazemos o parse do HTML a procura da informação desejada. Vamos a um exemplo simples: em uma nova aplicação, coloque um IdHTTP, um Label e um Button. No evento OnClick do Button digite:

 

var s: string;

begin

  s := IdHTTP1.Get('http://br.invertia.com');

  Label1.Caption := copy(s,pos('Compra',s) + 115,7);

end;

 

O código anterior mostra em um Label a cotação on-line do dólar, obtida através da consulta HTTP ao site indicado no código. Recebido o retorno, procuramos por uma palavra-chave no HTML (de preferência que seja sempre fixa) e fazemos a captura do valor pela posição relativa.

 

4. Preenchendo formulários de Web Sites programaticamente

GP - No exemplo anterior, recuperamos uma página da Web apenas indicando a URL. Muitas vezes, no entanto, o conteúdo de retorno depende da passagem de parâmetros ou do preenchimento de campos de um formulário. Vou dar um exemplo: o site de pesquisa Google possui uma opção para tradução (ferramentas de idiomas). Antes de obter a página com a tradução de uma palavra/texto, precisamos passar o valor do campo desejado na requisição HTTP. É exatamente isso que fiz no código da Listagem 4. Nele, o texto em inglês digitado em um Memo é traduzido para o português. Observe que o parse é feito de forma totalmente manual.

Imagine o leque de opções que você terá agora, sabendo como utilizar esse recurso. Poderá integrar sua aplicação a uma gama enorme de serviços disponibilizados na Web, mesmo que não sejam oferecidos via Web Services.

 

Listagem 4. Preenchendo formulários Web programaticamente

procedure TForm1.Button2Click(Sender: TObject);

var

  s: string;

  Fields: TStrings;

  p: integer;

begin

  Fields := TStringList.Create;

  Fields.Add('text=' + memo1.lines.Text);

  Fields.Add('langpair=en|pt');

  s := IdHTTP1.Post(

    'http://translate.google.com/translate_t',Fields);

  p := pos('PHYSICAL',s) + 9;

  Memo1.lines.Clear;

  while s[p] <> '<' do

  begin

    Memo1.lines.Text := Memo1.lines.Text + (s[p]);

    p := p + 1;

  end;

  Fields.Free;

end;

 

Nota: O preenchimento automático de formulários Web e a postagem de requisições HTTP via programação é algo que pode prejudicar os serviços disponibilizados por empresas. É muito simples, por exemplo, criar um programa que fique cadastrando usuários em um site (enchendo o BD de “lixo”), ou fazendo propaganda em chats, ou fazendo spam para celular, usando as técnicas aqui demonstradas. Dessa forma, web sites utilizam várias técnicas para impedir a ação de programas automáticos: validação via cookies, sessão, IP ou ainda pedindo para que o usuário digite um texto exibido em uma imagem, que em teoria não pode ser lido através de programação.

 

5. Descobrindo quando uma página da Web foi atualizada

GP - Nos exemplos anteriores, vimos como usar o componente ...

Quer ler esse conteúdo completo? Tenha acesso completo