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,提问作者Антон Михайлов
相关产品推荐
相关产品推荐

