objective-c - 在 MacOS 上截取屏幕截图

标签 objective-c macos delphi firemonkey

在 Firemonkey 11.1 中,我有两名员工使用 MacOS。

第一个

  • Mac OS Catalina 和笔记本电脑 1280x800
  • 外接显示器 1920x1080

第二个

  • Mac OS Monterey 和笔记本电脑 1440x900
  • 外接显示器 1920x1080

Workstation

在第一个屏幕上,我可以截取笔记本电脑屏幕的屏幕截图,但不能截取外部显示器的屏幕截图。第二个则相反。

我像这样截图,然后尝试一些解决方法:

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, 0
  • CGDisplayBounds #2 也失败了

完整桌面(屏幕 1 + 2) 我可以使用 0, 0, 3200, 1920 拍摄完整的桌面屏幕截图

在第二个工作站上:

第一个屏幕

  • FID = 0
  • ACaptureRect = 0, 0, 1440, 900
  • CGDisplayCreateImageForRect 失败
  • CGDisplayCreateImage(0) 失败
  • CGDisplayBounds 失败返回 0, 0, 1440, 900
  • CGDisplayBounds #2 也失败 0, 0, 1440, 900

第二个屏幕

  • FID = 1
  • ACaptureRect = 1440, 0, 1920, 1080
  • 第一个 CGDisplayCreateImageForRect 的屏幕截图正常

完整桌面(屏幕 1 + 2) 它失败了,因为它基于之前也失败过的显示器 0。

没有逻辑为什么只有笔记本电脑屏幕在第一个工作站上工作,而只有外部显示器在第二个笔记本电脑上工作。

两者都在同一屏幕上(在笔记本电脑上)打开应用程序

区别在于,在第二台笔记本电脑(位于蒙特利)上,即使我无法使用笔记本电脑屏幕,CGDisplayBounds也会返回合适的尺寸。

我没有想法和解决方法

编辑:在第二个工作站的同一台笔记本电脑上,但在 BigSur 版本(不是蒙特利)中一切正常!太疯狂了

最佳答案

@ptitBoss:你的FID简单不好,你检索它的方式不对。使用CGGetOnlineDisplayListCGGetActiveDisplayList等函数。

关于objective-c - 在 MacOS 上截取屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72175232/

相关文章:

objective-c - 在 OSX/cocoa 应用程序中以编程方式读取 Objective C 中的崩溃日志

javascript - Webkit 列查找可见文本的范围

ios - 我应该使用委托(delegate)在后台运行无限循环吗?

ios - 基础类(class)的扩展

macos - 权限错误通过 osx 上的 vagrant 通过 Chef 通过 Homebrew 软件安装 ruby

objective-c - NSMenu 以编程方式选择项目

bash - 使用终端检查 MacOS 上是否安装了应用程序

delphi - 获取 MaxLen 参数以与 MinimizeName 一起使用

windows - 获取文件系统限制

database - 在 Delphi 应用程序中使用哪种嵌入式数据库?