Jak zrobić zrzut ekranu za pomocą FireMonkey (multi-platform)

Nie znalazłem funkcji do pobrania zrzutu ekranu w FMX.Platform (zresztą nigdzie indziej ...).

Z VCL jest wiele odpowiedzi (stackoverflow, google, ...).

Ale jak uzyskać zrzut ekranu na obrazie (mapa bitowa lub cokolwiek innego) dla Windows i Mac OS X?

Pozdrowienia,

W.

Aktualizacja: Thelink z Tipiweb daje dobre rozwiązanie dla OS X.

Odnośnie części Windows: Zakodowałem to, ale nie lubię używać VCL i Streamu, aby to osiągnąć ... Jakaś lepsza sugestia, komentarze?

Dzięki.

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>

questionAnswers(3)

yourAnswerToTheQuestion