macOS截取屏幕窗口CGWindowListCreateImage
macOS截取屏幕窗口CGWindowListCreateImage

macOS截取屏幕窗口CGWindowListCreateImage

CGWindowListCreateImage 是 macOS 系统提供的 Core Graphics 框架函数,用于截取屏幕上窗口或屏幕区域的图像,它的核心作用是:

从当前屏幕或指定窗口列表中“生成一张图像”,通常用于屏幕截图或窗口预览功能。

基本用法

func CGWindowListCreateImage(
    _ screenBounds: CGRect,
    _ listOption: CGWindowListOption,
    _ windowID: CGWindowID,
    _ imageOption: CGWindowImageOption
) -> CGImage?

1、screenBounds:CGRect类型,要截图的区域坐标(通常是整个屏幕的 rect,如 CGRectInfinite 表示全屏)。

1)CGRect.infinite(或 CGRectInfinite)表示全屏;

2)CGRect(x: 0, y: 0, width: 100, height: 100) 表示屏幕上的指定矩形区域;

3)如果是基于窗口截图,可以传 .null 来忽略这个参数。

2、listOption:CGWindowListOption类型,截图时选取哪些窗口,如全部窗口、在某窗口上方的窗口等。

.optionAll:截取所有窗口,覆盖全屏;

.optionOnScreenOnly:只截取当前在屏幕可见区域内的窗口;

.optionOnScreenAboveWindow:只截取在指定 windowID 上方的窗口;

.optionOnScreenBelowWindow:只截取在指定 windowID 下方的窗口;

.optionIncludingWindow:包含传入的 windowID 所代表的窗口;

.excludeDesktopElements:排除桌面图标、墙纸等系统窗口(如 Finder 桌面)

可组合使用,例如:

[.optionOnScreenOnly, .optionIncludingWindow]

3、windowID:CGWindowID类型,可以是某个具体窗口的 ID,用于限定截图范围;如果无关,填 kCGNullWindowID。

来自系统获取的窗口列表(比如通过 CGWindowListCopyWindowInfo(…) 获取)。

如果不指定任何窗口,就传:kCGNullWindowID(值为 0);

如果设置了 .optionIncludingWindow,这里就必须传一个有效 CGWindowID;

如果传了 .optionOnScreenAboveWindow 或 .optionOnScreenBelowWindow,这里的窗口 ID 就表示参考窗口。

4、imageOption:CGWindowImageOption类型,控制是否包含阴影、透明度等图像特效。

.bestResolution:获取 Retina 高分辨率图像(默认不一定是 Retina);

.boundsIgnoreFraming:忽略窗口边框和阴影,截取窗口内容区域;

.shouldBeOpaque:图像不包含透明区域,全部填充为不透明;

.onlyShadows:只截取窗口阴影(极少使用);

.nominalResolution:使用屏幕的标称分辨率(非 Retina)。

可组合使用,一般推荐:.bestResolution + .boundsIgnoreFraming。

使用场景

1、截取整个屏幕

let image = CGWindowListCreateImage(
    CGRect.infinite,
    .optionAll,
    kCGNullWindowID,
    [.bestResolution, .boundsIgnoreFraming]
)

2、截取某个窗口的图像

let windowID: CGWindowID = 12345  // 目标窗口的 ID
let image = CGWindowListCreateImage(
    CGRect.null,
    .optionIncludingWindow,
    windowID,
    [.bestResolution]
)

窗口ID可以通过CGWindowListCopyWindowInf获取,相关文章《macOS窗口信息CGWindowListCopyWindowInf》。

应用场景

实现屏幕截图工具(如截图软件 SnapSlim);

获取某窗口的缩略图或预览图;

做远程桌面 / 投屏等功能;

截图时可避开 Dock、菜单栏、某些窗口等。

总结

CGWindowListCreateImage可以截取屏幕上窗口或屏幕区域的图像。

CGWindowListCreateImage需要用户的录屏与系统录音权限,首次调用会弹出授权提示,可以在设置 – 隐私与安全性 – 录屏与系统录音设置权限。

如果用户不授予该权限,只能截取桌面背景,不能获取应用、Dock和状态栏的图像。

相关文章

1、macOS截图CGDisplayCreateImage:https://fangjunyu.com/2025/07/20/macos%e6%88%aa%e5%9b%becgdisplaycreateimage/

2、macOS窗口信息CGWindowListCopyWindowInf:https://fangjunyu.com/2025/07/23/macos%e7%aa%97%e5%8f%a3%e4%bf%a1%e6%81%afcgwindowlistcopywindowinf/

扩展知识

CGWindowListCreateImage和CGWindowListCreateImage的区别

两者都可以截取全屏图片,区别在于:

CGDisplayCreateImage:直接从屏幕帧缓冲获取像素,不会包含透明内容,也不关心窗口层级,通过硬件加速,在性能方面更快。

CGWindowListCreateImage:从CoreGraphics 窗口服务器(高层)合成的图像中获取,可以包括透明内容、指定窗口、排除窗口、屏幕区域等,更灵活,性能方面稍慢一点。

因此,CGDisplayCreateImage适合快速全屏截图,不包含透明背景。CGWindowListCreateImage适合截图带阴影窗口、选取区域、带透明背景等场景。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注