Wie mache ich einen Screenshot mit FireMonkey (Multi-Plattformen)

Ich habe keine Funktion gefunden, um einen Screenshot in FMX.Platform zu erhalten (jedenfalls nirgendwo anders ...).

Mit der VCL gibt es viele Antworten (Stackoverflow, Google, ...).

Aber wie bekommt man einen Screenshot in einem Bild (Bitmap oder was auch immer) für Windows und Mac OS X?

Grüße,

W.

Aktualisieren: DasLink von Tipiweb gibt eine gute Lösung für OS X.

Zum Windows-Teil: Ich habe dies codiert, verwende aber nicht gerne die VCL und einen Stream, um dies zu erreichen ... Gibt es einen besseren Vorschlag, Kommentare?

Vielen Dank.

W.

<code>uses ..., FMX.Types, Winapi.Windows, Vcl.Graphics;

...

function DesktopLeft: Integer;
begin
  Result := GetSystemMetrics(SM_XVIRTUALSCREEN);
end;

function DesktopWidth: Integer;
begin
  Result := GetSystemMetrics(SM_CXVIRTUALSCREEN);
end;

function DesktopTop: Integer;
begin
  Result := GetSystemMetrics(SM_YVIRTUALSCREEN);
end;

function DesktopHeight: Integer;
begin
  Result := GetSystemMetrics(SM_CYVIRTUALSCREEN);
end;


procedure GetScreenShot(var dest: FMX.Types.TBitmap);
var
  cVCL  : Vcl.Graphics.TCanvas;
  bmpVCL: Vcl.Graphics.TBitmap;
  msBmp : TMemoryStream;
begin
  bmpVCL      := Vcl.Graphics.TBitmap.Create;
  cVCL        := Vcl.Graphics.TCanvas.Create;
  cVCL.Handle := GetWindowDC(GetDesktopWindow);
  try
    bmpVCL.Width := DesktopWidth;
    bmpVCL.Height := DesktopHeight;
    bmpVCL.Canvas.CopyRect(Rect(0, 0, DesktopWidth, DesktopHeight),
                           cVCL,
                           Rect(DesktopLeft, DesktopTop, DesktopLeft + DesktopWidth, DesktopTop + DesktopHeight)
                          );
  finally
    ReleaseDC(0, cVCL.Handle);
    cVCL.Free;
  end;

  msBmp := TMemoryStream.Create;
  try
    bmpVCL.SaveToStream(msBmp);
    msBmp.Position := 0;
    dest.LoadFromStream(msBmp);
  finally
    msBmp.Free;
  end;
</code>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage