You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS下如何用CGDisplayCreateImage捕获不含光标的屏幕截图?

在macOS Sierra中捕获不含光标的屏幕截图

我明白你遇到的问题——macOS Sierra之后,kCGDisplayStreamShowCursor这个控制光标显示的参数确实失效了,用CGDisplayCreateImage截图时总会带上光标。这里有个可靠的解决方案,核心思路是临时隐藏系统光标,完成截图后再立即恢复,用户几乎不会察觉到光标有短暂消失:

方法:临时隐藏光标再截图

这个方法的关键是在调用截图API前快速隐藏光标,截图完成后马上恢复,确保截图里不会包含光标。下面是Objective-C和Swift的实现示例:

Objective-C 代码示例

// 保存当前光标状态,用于后续恢复
CGEventRef event = CGEventCreate(NULL);
CGCursorRef currentCursor = CGEventGetCursor(event);
CFRelease(event);

// 隐藏主显示器的光标
CGDisplayHideCursor(kCGDirectMainDisplay);
CGAssociateMouseAndMouseCursorPosition(true);

// 执行屏幕截图
CGImageRef screenshot = CGDisplayCreateImage(kCGDirectMainDisplay);

// 恢复光标状态
CGDisplayShowCursor(kCGDirectMainDisplay);
if (currentCursor) {
    CGDisplaySetCursor(kCGDirectMainDisplay, currentCursor);
}

// 后续处理截图(比如保存到文件、转换格式等)
// ...

// 记得释放CGImageRef资源
CFRelease(screenshot);

Swift 代码示例

import CoreGraphics

// 保存当前光标状态
let event = CGEvent(source: nil)
let currentCursor = event?.cursor

// 隐藏主显示器光标
CGDisplayHideCursor(CGMainDisplayID())
CGAssociateMouseAndMouseCursorPosition(true)

// 使用defer确保无论是否出错,光标都会被恢复
defer {
    CGDisplayShowCursor(CGMainDisplayID())
    if let cursor = currentCursor {
        CGDisplaySetCursor(CGMainDisplayID(), cursor)
    }
}

// 执行截图
guard let screenshot = CGDisplayCreateImage(CGMainDisplayID()) else {
    print("截图失败")
    return
}

// 后续处理截图
// ...

为什么这个方法有效?

CGDisplayCreateImage是同步截取当前屏幕的瞬时状态,所以在截图前隐藏光标,截图时屏幕上就没有光标,自然不会被捕获到。而恢复光标的操作紧跟在截图之后,用户几乎感觉不到光标有消失过。

另外,CGAssociateMouseAndMouseCursorPosition(true)这一步是确保光标位置和鼠标位置保持关联,避免隐藏光标后出现鼠标位置和光标不同步的异常情况。

内容的提问来源于stack exchange,提问作者Антон Михайлов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:40:31