Einzelnen Beitrag anzeigen

Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Screenshot machen (zum 125.000sten Mal *gg*)

  Alt 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.)
  Mit Zitat antworten Zitat