Ver Mensaje Individual
  #6  
Antiguo 19-04-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Bueno, si no queda mas remedio que usar el zoom, usemoslo

Una primera aproximacion podria ser esta:
Código:
var
  SrcWindow: THandle;
  SrcDC: HDC;
begin
  // Borramos toda la superficie de dibujo
  Canvas.FillRect(Canvas.ClipRect);
  SrcWindow:= GetDesktopWindow;  
  if SrcWindow <> 0 then
  begin
    SrcDC:= GetDC(SrcWindow);
    if SrcDC <> 0 then
    try
      // Copiaria el area de la pantalla comprendida entre 0,0 y 100,100
      StretchBlt(Canvas.Handle,0,0,Width,Height,SrcDC,0,0,100,100,SRCCOPY);
    finally
      ReleaseDC(SrcWindow,SrcDC);
    end;
  end;
end;
Esto colocado dentro de un Timer nos copiaria el area que deseamos, ajustada al tamaño del form.

Pero seria mas adecuado definir las coordenadas con respecto a la esquina superior izquierda de la aplicacion a vigilar y no con respecto a la esquina de la pantalla, asi que podriamos usar algo como esto:

Código:
  // Cambiamos esta linea
  SrcWindow:= GetDesktopWindow;
  // Por esta otra
  SrcWindow:= FindWindow(nil,'Titulo');
  // Donde titulo es el titulo de la ventana a controlar
Y si le queremos dar otra vuelta de tuerca, habras notado que el codigo anterior muestra un desgradable parpadeo. Pues podemos solucionando usando un bitmap en un paso intermedio

Algo asi:
Código:
var
  SrcWindow: THandle;
  SrcDC: HDC;
  Bmp: TBitmap;
begin
  Bmp:= TBitmap.Create;
  try
    Bmp.Width:= Width;
    Bmp.Height:= Height;
    Bmp.Canvas.Brush.Color:= clBlack;
    Bmp.Canvas.FillRect(Bmp.Canvas.ClipRect);
    //SrcWindow:= GetDesktopWindow;
    SrcWindow:= FindWindow(nil,'Titulo');
    if SrcWindow <> 0 then
    begin
      SrcDC:= GetDC(SrcWindow);
      if SrcDC <> 0 then
      try
        StretchBlt(Bmp.Canvas.Handle,0,0,Width,Height,SrcDC,0,0,100,100,SRCCOPY);
      finally
        ReleaseDC(SrcWindow,SrcDC);
      end;
    end;
    Canvas.Draw(0,0,Bmp);
  finally
    Bmp.Free;
  end;
Ahora solo te queda poner el codigo que mas te guste en el evento de un timer, con un intervalo de 200 milisegundos por ejemplo, y acertar con las coordenadas correctas y ya esta.

Espero que te sirva
Responder Con Cita