Como tirar uma captura de tela com o FireMonkey (multi-plataformas)

Eu não encontrei uma função para obter uma captura de tela no FMX.Platform (de qualquer forma, em nenhum outro lugar ...).

Com o VCL, existem muitas respostas (stackoverflow, google, ...).

Mas como obter uma captura de tela em uma imagem (bitmap ou qualquer outro) para Windows e Mac OS X?

Saudações,

W.

Atualizar: oligação de Tipiweb dá uma boa solução para o OS X.

Em relação à parte do Windows: Eu codifiquei isso, mas eu não gosto de usar o VCL, e um Stream para alcançá-lo ... Alguma sugestão melhor, comentários?

Obrigado.

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