Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
Delphi 10.4 Sydney
|
AW: Screenshot machen (zum 125.000sten Mal *gg*)
9. Aug 2012, 15:00
Habs! Das Stichwort GetDC(0) war die Erleuchtung. Zumindest hatte ich dadurch schon mal einen Ansatz vor Augen. Dadurch habe ich im SDC schnell etwas gefunden und adaptiert:
Delphi-Quellcode:
procedure CaptureScreen(ABitmap: Graphics.TBitmap);
const
CAPTUREBLT = $40000000;
var
hdcScreen: HDC;
hdcCompatible: HDC;
hbmScreen: HBITMAP;
begin
hdcScreen:= CreateDC('DISPLAY', nil, nil, nil);
hdcCompatible:= CreateCompatibleDC(hdcScreen);
hbmScreen:= CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen, HORZRES),
GetDeviceCaps(hdcScreen, VERTRES));
SelectObject(hdcCompatible, hbmScreen);
ABitmap.Handle:= hbmScreen;
BitBlt(hdcCompatible, 0, 0, ABitmap.Width, ABitmap.Height, hdcScreen, 0, 0,
SRCCOPY or CAPTUREBLT);
DeleteDC(hdcScreen);
DeleteDC(hdcCompatible);
end;
procedure GrabScreenshotFromWindow(AHandle: HWND;
ATargetBitmap: Graphics.TBitmap);
var
R: TRect;
DeskBMP: Graphics.TBitmap;
begin
DeskBMP:= Graphics.TBitmap.Create;
try
CaptureScreen(DeskBMP);
GetWindowRect(AHandle, R);
ATargetBitmap.Width:=R.Right - R.Left;
ATargetBitmap.Height:=R.Bottom - R.Top;
ATargetBitmap.Canvas.CopyRect(R, DeskBMP.Canvas, R);
finally
DeskBMP.Free;
end;
end;
Scheint soweit auch mit Overlays und Alphatransparenzen klar zu kommen (Menüschatten etc.)
|
|
Zitat
|