macOS可捕获内容SCShareableContent
macOS可捕获内容SCShareableContent

macOS可捕获内容SCShareableContent

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。

   

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

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

发表回复

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