在 Firemonkey 11.1 中,我有两名员工使用 MacOS。
第一个
- Mac OS Catalina 和笔记本电脑 1280x800
- 外接显示器 1920x1080
第二个
- Mac OS Monterey 和笔记本电脑 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
失败返回 0, 0, 0, 0CGDisplayBounds
#2 也失败了
完整桌面(屏幕 1 + 2) 我可以使用 0, 0, 3200, 1920 拍摄完整的桌面屏幕截图
在第二个工作站上:
第一个屏幕
FID = 0
ACaptureRect = 0, 0, 1440, 900
CGDisplayCreateImageForRect
失败CGDisplayCreateImage(0)
失败CGDisplayBounds
失败返回 0, 0, 1440, 900CGDisplayBounds
#2 也失败 0, 0, 1440, 900
第二个屏幕
FID = 1
ACaptureRect = 1440, 0, 1920, 1080
- 第一个
CGDisplayCreateImageForRect
的屏幕截图正常
完整桌面(屏幕 1 + 2) 它失败了,因为它基于之前也失败过的显示器 0。
没有逻辑为什么只有笔记本电脑屏幕在第一个工作站上工作,而只有外部显示器在第二个笔记本电脑上工作。
两者都在同一屏幕上(在笔记本电脑上)打开应用程序
区别在于,在第二台笔记本电脑(位于蒙特利)上,即使我无法使用笔记本电脑屏幕,CGDisplayBounds
也会返回合适的尺寸。
我没有想法和解决方法
编辑:在第二个工作站的同一台笔记本电脑上,但在 BigSur 版本(不是蒙特利)中一切正常!太疯狂了
最佳答案
@ptitBoss:你的FID简单不好,你检索它的方式不对。使用CGGetOnlineDisplayList
、CGGetActiveDisplayList
等函数。
关于objective-c - 在 MacOS 上截取屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72175232/