- Antes que nada, tiene que obtener la ventana derecha. Como sharptooth ya señaló, debe usar
GetForegroundWindow
en lugar de GetDesktopWindow
. Lo ha hecho bien en su improved version.
- Pero luego tiene que cambiar el tamaño de su mapa de bits al tamaño real de la ventana DC /. No has hecho esto todavía.
- ¡Y luego asegúrese de no capturar ninguna ventana de pantalla completa!
Cuando ejecuté su código, mi Delphi IDE fue capturado y como está en pantalla completa por defecto, creó la ilusión de una captura de pantalla a pantalla completa. (Aunque su código es en su mayoría correcto)
Considerando los pasos anteriores, pude crear con éxito una captura de pantalla de una sola ventana con su código.
Solo una pista: Puede GetDC
en lugar de GetWindowDC
si solo está interesado en el área de clientes. (No hay bordes de las ventanas)
EDIT: Esto es lo que hice con su código:
Usted no debe utilizar este código! Mira la versión mejorada a continuación.
procedure TForm1.Button1Click(Sender: TObject);
const
FullWindow = True; // Set to false if you only want the client area.
var
hWin: HWND;
dc: HDC;
bmp: TBitmap;
FileName: string;
r: TRect;
w: Integer;
h: Integer;
begin
form1.Hide;
sleep(500);
hWin := GetForegroundWindow;
if FullWindow then
begin
GetWindowRect(hWin,r);
dc := GetWindowDC(hWin) ;
end else
begin
Windows.GetClientRect(hWin, r);
dc := GetDC(hWin) ;
end;
w := r.Right - r.Left;
h := r.Bottom - r.Top;
bmp := TBitmap.Create;
bmp.Height := h;
bmp.Width := w;
BitBlt(bmp.Canvas.Handle, 0, 0, w, h, DC, 0, 0, SRCCOPY);
form1.Show ;
FileName := 'Screenshot_'+FormatDateTime('mm-dd-yyyy-hhnnss',now());
bmp.SaveToFile(Format('C:\Screenshots\%s.bmp', [FileName]));
ReleaseDC(hwin, DC);
bmp.Free;
end;
EDIT 2: conforme a lo solicitado estoy añadiendo una mejor versión del código, pero me quedo con el anterior como referencia. Deberías considerar seriamente usar esto en lugar de tu código original. Se comportará mucho mejor en caso de errores. (Los recursos se limpian, su formulario será visible de nuevo, ...)
procedure TForm1.Button1Click(Sender: TObject);
const
FullWindow = True; // Set to false if you only want the client area.
var
Win: HWND;
DC: HDC;
Bmp: TBitmap;
FileName: string;
WinRect: TRect;
Width: Integer;
Height: Integer;
begin
Form1.Hide;
try
Application.ProcessMessages; // Was Sleep(500);
Win := GetForegroundWindow;
if FullWindow then
begin
GetWindowRect(Win, WinRect);
DC := GetWindowDC(Win);
end else
begin
Windows.GetClientRect(Win, WinRect);
DC := GetDC(Win);
end;
try
Width := WinRect.Right - WinRect.Left;
Height := WinRect.Bottom - WinRect.Top;
Bmp := TBitmap.Create;
try
Bmp.Height := Height;
Bmp.Width := Width;
BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);
FileName := 'Screenshot_' +
FormatDateTime('mm-dd-yyyy-hhnnss', Now());
Bmp.SaveToFile(Format('C:\Screenshots\%s.bmp', [FileName]));
finally
Bmp.Free;
end;
finally
ReleaseDC(Win, DC);
end;
finally
Form1.Show;
end;
end;
Usted debe enviar su versión mejorada (s) aquí, debajo de su original ejemplo, para que otros puedan beneficiarse de su "rastro de aprendizaje" también. –
Aclare: ¿Desea tomar una captura de pantalla de otro formulario en el mismo programa o de cualquier programa que esté visible cuando se oculta Form1? – mghie
Quiero que tome desde la ventana activa una vez que el formulario está oculto. – PuppyKevin