在 MacOS 上截图
Take screenshot on MacOS
使用 Firemonkey 11.1,我有两名员工使用 MacOS。
第一个
- Mac OS Catalina 和笔记本电脑 1280x800
- 外接显示器 1920x1080
第二个
- Mac OS 蒙特雷笔记本电脑 1440x900
- 外接显示器 1920x1080
在第一个上,我可以截取笔记本电脑的屏幕截图,但不能截取外接显示器。第二次正好相反
我这样截屏,然后尝试一些解决方法:
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;
在第一个工作站上:
第一屏
FID = 0
ACaptureRect = 0, 0, 1280, 800
- 第一个截图成功
CGDisplayCreateImageForRect
第二屏
FID = 1
ACaptureRect = 1280, 0, 1920, 1080
CGDisplayCreateImageForRect
失败
CGDisplayCreateImage(1)
失败
CGDisplayBounds
失败 return 0, 0, 0, 0
CGDisplayBounds
#2 也失败了
完整桌面(屏幕 1 + 2)
我可以使用 0, 0, 3200, 1920
截取完整的桌面截图
在第二个工作站上:
第一屏
FID = 0
ACaptureRect = 0, 0, 1440, 900
CGDisplayCreateImageForRect
失败
CGDisplayCreateImage(0)
失败
CGDisplayBounds
失败 return 0, 0, 1440, 900
CGDisplayBounds
#2 也失败了 0, 0, 1440, 900
第二屏
FID = 1
ACaptureRect = 1440, 0, 1920, 1080
- 第一个截图成功
CGDisplayCreateImageForRect
完整桌面(屏幕 1 + 2)
它失败了,因为它基于之前也失败过的显示器 0。
为什么只有笔记本电脑屏幕在第一台工作站上工作,而只有外部显示器在第二台笔记本电脑上工作,这是不合逻辑的。
两者都在同一屏幕上打开了应用程序(在笔记本电脑上)
不同之处在于,在第二台笔记本电脑(在蒙特雷)上,即使我不能拿笔记本电脑的屏幕,CGDisplayBounds
return 大小合适。
我没有想法和解决方法
编辑:在第二个工作站的同一台笔记本电脑上,但在 BigSur 版本(不是 Monterey)中一切正常!太疯狂了
@ptitBoss:你的FID简单不好,你找错了。使用 CGGetOnlineDisplayList
、CGGetActiveDisplayList
等函数
使用 Firemonkey 11.1,我有两名员工使用 MacOS。
第一个
- Mac OS Catalina 和笔记本电脑 1280x800
- 外接显示器 1920x1080
第二个
- Mac OS 蒙特雷笔记本电脑 1440x900
- 外接显示器 1920x1080
在第一个上,我可以截取笔记本电脑的屏幕截图,但不能截取外接显示器。第二次正好相反
我这样截屏,然后尝试一些解决方法:
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;
在第一个工作站上:
第一屏
FID = 0
ACaptureRect = 0, 0, 1280, 800
- 第一个截图成功
CGDisplayCreateImageForRect
第二屏
FID = 1
ACaptureRect = 1280, 0, 1920, 1080
CGDisplayCreateImageForRect
失败CGDisplayCreateImage(1)
失败CGDisplayBounds
失败 return 0, 0, 0, 0CGDisplayBounds
#2 也失败了
完整桌面(屏幕 1 + 2) 我可以使用 0, 0, 3200, 1920
截取完整的桌面截图在第二个工作站上:
第一屏
FID = 0
ACaptureRect = 0, 0, 1440, 900
CGDisplayCreateImageForRect
失败CGDisplayCreateImage(0)
失败CGDisplayBounds
失败 return 0, 0, 1440, 900CGDisplayBounds
#2 也失败了 0, 0, 1440, 900
第二屏
FID = 1
ACaptureRect = 1440, 0, 1920, 1080
- 第一个截图成功
CGDisplayCreateImageForRect
完整桌面(屏幕 1 + 2) 它失败了,因为它基于之前也失败过的显示器 0。
为什么只有笔记本电脑屏幕在第一台工作站上工作,而只有外部显示器在第二台笔记本电脑上工作,这是不合逻辑的。
两者都在同一屏幕上打开了应用程序(在笔记本电脑上)
不同之处在于,在第二台笔记本电脑(在蒙特雷)上,即使我不能拿笔记本电脑的屏幕,CGDisplayBounds
return 大小合适。
我没有想法和解决方法
编辑:在第二个工作站的同一台笔记本电脑上,但在 BigSur 版本(不是 Monterey)中一切正常!太疯狂了
@ptitBoss:你的FID简单不好,你找错了。使用 CGGetOnlineDisplayList
、CGGetActiveDisplayList
等函数