Home > Enterprise >  Take screenshot on MacOS
Take screenshot on MacOS

Time:05-11

With Firemonkey 11.1, I have two employees using MacOS.

The first one

  • Mac OS Catalina with laptop 1280x800
  • External display 1920x1080

The second one

  • Mac OS Monterey with laptop 1440x900
  • External display 1920x1080

Workstation

On the first one I can take screenshot of the screen of the laptop but not the external display. On the second it's the opposite.

I take screenshot like that, and I try some workaround :

LImage := CGDisplayCreateImageForRect(FID, RectToCGTrect(ACaptureRect));

if not Assigned(LImage) then
  LImage := CGDisplayCreateImage(FID);

if not Assigned(LImage) then 
begin
  LBounds := CGDisplayBounds(FID);
  LImage := CGDisplayCreateImageForRect(FID, LBounds);
end;

if not Assigned(LImage) then 
begin
  LBounds := CGDisplayBounds(FID);
  LBounds.origin.x := 0;
  LBounds.origin.y := 0;

  LImage := CGDisplayCreateImageForRect(FID, LBounds);
end;

On first workstation :

First screen

  • FID = 0
  • ACaptureRect = 0, 0, 1280, 800
  • Screenshot OK with first CGDisplayCreateImageForRect

Second screen

  • FID = 1
  • ACaptureRect = 1280, 0, 1920, 1080
  • CGDisplayCreateImageForRect failed
  • CGDisplayCreateImage(1) failed
  • CGDisplayBounds failed return 0, 0, 0, 0
  • CGDisplayBounds #2 failed too

Full desktop (screen 1 2) I can take full desktop screenshot with 0, 0, 3200, 1920

On second workstation :

First screen

  • FID = 0
  • ACaptureRect = 0, 0, 1440, 900
  • CGDisplayCreateImageForRect failed
  • CGDisplayCreateImage(0) failed
  • CGDisplayBounds failed return 0, 0, 1440, 900
  • CGDisplayBounds #2 failed too 0, 0, 1440, 900

Second screen

  • FID = 1
  • ACaptureRect = 1440, 0, 1920, 1080
  • Screenshot OK with first CGDisplayCreateImageForRect

Full desktop (screen 1 2) It failed as it's base on display 0 that previously failed too.

There is no logic why only laptop screen work on first workstation, and only external display work on second laptop.

Both have app open on the same screen (on the laptop)

The difference, it that on second laptop (on Monterey), even when I can't take laptop screen, CGDisplayBounds return the good size.

I'm out of idea and workaround

EDIT : On same laptop of second workstation, but in BigSur version (not Monterey) all working well ! That's insane

CodePudding user response:

@ptitBoss: Your FID is simple not good, you retrieve it in the wrong way. Use functions like CGGetOnlineDisplayList, CGGetActiveDisplayList, etc.

  • Related