SCShareableContent 是 Apple 在 macOS 12+ 引入的 ScreenCaptureKit 框架中的一个类,作用是:获取当前系统中可被捕获的内容列表,包括所有的显示器(SCDisplay)、窗口(SCWindow)、以及正在运行的应用程序(SCRunningApplication)。
可以通过 SCShareableContent. getWithCompletionHandler {} 来异步获取当前可捕获内容:
SCShareableContent.getWithCompletionHandler { content, error in
if let content = content {
let displays = content.displays
let apps = content.applications
let windows = content.windows
// 你可以根据这些内容来创建 SCContentFilter
} else if let error = error {
print("获取失败:\(error)")
}
}
常用属性
1、displays:[SCDisplay]类型,当前所有可捕获的屏幕(包括主屏、副屏);
display:<SCDisplay: 0x60000247ff40>
2、windows:[SCWindow]类型,所有可被捕获的窗口(可用来筛选特定窗口);
window:<SCWindow: 0x600001251a40>
3、applications:[SCRunningApplication]类型,所有拥有窗口的正在运行的 App。
app:bundleIdentifier=com.fangjunyu.SnapSlim applicationName=轻截图片 processID=80996
常用方法
1、getWithCompletionHandler:获取所有可共享内容;
2、getExcludingDesktopWindows(_:onScreenWindowsOnly:completionHandler:):获取排除桌面和不可见窗口的共享内容;
3、getExcludingDesktopWindows(_:onScreenWindowsOnlyAbove:completionHandler:):获取排除桌面且在某个窗口之上的窗口;
4、getExcludingDesktopWindows(_:onScreenWindowsOnlyBelow:completionHandler:):获取排除桌面且在某个窗口之下的窗口;
5、getCurrentProcessShareableContent:获取当前进程(App)可共享的内容,适用于只需要自己窗口内容的场景;
6、info(for:):用给定的 SCContentFilter 获取对应的元信息。
使用场景
1、选择第一个主屏幕并捕获
SCShareableContent.getWithCompletionHandler { content, error in
guard let content = content else { return }
// 获取第一个屏幕
if let display = content.displays.first {
let filter = SCContentFilter(display: display,
excludingApplications: [],
exceptingWindows: [])
let config = SCStreamConfiguration()
config.showsCursor = true
Task {
let stream = try await SCStream(filter: filter, configuration: config, delegate: self)
try stream.addStreamOutput(self, type: .screen, sampleHandlerQueue: .main)
try await stream.startCapture()
}
}
}
总结
SCShareableContent 是使用 ScreenCaptureKit 进行屏幕录制/截图的第一步,它提供了捕获内容的完整上下文(屏幕、窗口、应用),以便控制捕获目标(比如排除某些窗口或应用、仅截取某个屏幕等)。
相关文章
1、SCShareableContent:https://developer.apple.com/documentation/screencapturekit/scshareablecontent
2、macOS窗口信息CGWindowListCopyWindowInf:https://fangjunyu.com/2025/07/23/macos%e7%aa%97%e5%8f%a3%e4%bf%a1%e6%81%afcgwindowlistcopywindowinf/
扩展知识
CGWindowListCopyWindowInfo和SCShareableContent.getWithCompletionHandler的区别
CGWindowListCopyWindowInfo 和 SCShareableContent.getWithCompletionHandler 都能获取当前系统中窗口的信息,但它们的用途、权限模型、适用场景都有明显不同。
CGWindowListCopyWindowInfo:来源于Core Graphics (Quartz)框架,获取获取系统中所有窗口的元信息,包括所有窗口。但是不能录屏,以及访问窗口图像内容。
SCShareableContent.getWithCompletionHandler:来源于ScreenCaptureKit(macOS 12+),可以获取当前可录制/捕获的窗口、应用和显示器,用户授权范围内可录制的内容(受权限和系统限制)。可以与SCContentFilter 和 SCStream 结合使用,完全受屏幕录制权限控制(系统提示框),用于设置可捕获视频图像的数据源。
返回信息差异:CGWindowListCopyWindowInfo和SCShareableContent都可以返回窗口ID、应用PID、应用名称、窗口标题,但是CGWindowListCopyWindowInfo无法返回显示器信息,也不能用于录制视频。
CGWindowListCopyWindowInfo
let windowList = CGWindowListCopyWindowInfo(.optionAll, kCGNullWindowID) as? [[String: AnyObject]]
用于做系统监控、窗口列表显示(如类似 “Window Manager” 应用);
可查看当前哪些 App 打开了哪些窗口;
不能用于捕获窗口内容(只能获取坐标、标题、PID)。
SCShareableContent.getWithCompletionHandler
SCShareableContent.getWithCompletionHandler { content, error in
let apps = content?.applications
let displays = content?.displays
let windows = content?.windows
}
用于筛选允许录制的窗口或屏幕;
结合 SCContentFilter 用于构建捕获流 SCStream;
被系统严格限制,必须获取屏幕录制权限。
使用场景:
枚举所有窗口(如任务管理器):推荐使用CGWindowListCopyWindowInfo;
做录屏或截图应用:推荐使用SCShareableContent + SCContentFilter;
需要获取屏幕或窗口画面图像:推荐使用ScreenCaptureKit;
不需要图像,只要获取前台 App 名称:推荐使用NSWorkspace.shared.frontmostApplication 或 CGWindowListCopyWindowInfo。