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适合截图带阴影窗口、选取区域、带透明背景等场景。