编程截屏 | Swift 3,macOS

15

在Mac上使用Swift 3是否可以编程方式截取桌面截图?我无法在任何主题、论坛帖子或甚至是苹果官方文档中找到有关此主题的信息。

到目前为止,我已经找到了以下内容,但这似乎并没有帮助:one two


出于安全和隐私的考虑,从开发者和用户的角度来看都应高度重视。 - holex
是的,我明白,但我没有发布这个软件的意图,它更多是为了学习和内部部署目的,如果出现一个小的“接受截图”窗口,我也可以接受。 - user6879072
1
NSTask - screencapture - vadian
@vadian,你能给我指一些关于“NSTask - 屏幕截图”的示例代码、文档或其他有用的资源吗? - user6879072
4
NSTask 是 Cocoa 类,用于运行命令行接口。screencapture 是用于截屏的命令行接口。 - vadian
2个回答

28

是的,这是可能的。这个函数会拍摄所有连接的显示器截图,并将其作为 jpg 文件写入指定路径。生成的文件名为 Unix 时间戳。

 func TakeScreensShots(folderName: String){
    
    var displayCount: UInt32 = 0;
    var result = CGGetActiveDisplayList(0, nil, &displayCount)
    if (result != CGError.success) {
        print("error: \(result)")
        return
    }
    let allocated = Int(displayCount)
    let activeDisplays = UnsafeMutablePointer<CGDirectDisplayID>.allocate(capacity: allocated)
    result = CGGetActiveDisplayList(displayCount, activeDisplays, &displayCount)
    
    if (result != CGError.success) {
        print("error: \(result)")
        return
    }
       
    for i in 1...displayCount {
        let unixTimestamp = CreateTimeStamp()
        let fileUrl = URL(fileURLWithPath: folderName + "\(unixTimestamp)" + "_" + "\(i)" + ".jpg", isDirectory: true)
        let screenShot:CGImage = CGDisplayCreateImage(activeDisplays[Int(i-1)])!
        let bitmapRep = NSBitmapImageRep(cgImage: screenShot)
        let jpegData = bitmapRep.representation(using: NSBitmapImageRep.FileType.jpeg, properties: [:])!
        
        
        do {
            try jpegData.write(to: fileUrl, options: .atomic)
        }
        catch {print("error: \(error)")}
    }
}

func CreateTimeStamp() -> Int32
{
    return Int32(Date().timeIntervalSince1970)
}

我还没有检查你的代码,但它看起来很优秀,不像我使用脚本和终端解决问题的方式。我没想到会在这么长时间后得到任何答案。 - user6879072
1
它能够正常工作,实现得非常好,可以处理多个显示器。 - Magrafear
@B.Tekkan @Magrafear 我遇到了一个错误 CreateTimeStamp(): let unixTimestamp = CreateTimeStamp() "use of unresolved identifier 'CreateTimeSpan'" - user6879072
只需创建一个名为CreateTimeStamp()的函数,该函数返回格式化为所需字符串的Date()或NSDate()。 - Magrafear
CreateTimeStamp()方法只是为文件创建一个唯一的名称。我为您添加了该方法。 - B.Tekkan

14
let displayID = CGMainDisplayID()
let imageRef = CGDisplayCreateImage(displayID)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接