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