代码如下:
import SwiftUI
import ScreenCaptureKit
struct ContentView: View {
@State private var showingScreenshotAlert = false
@State private var screenshotRect = CGRect(x: 100, y: 100, width: 400, height: 300) // 示例区域
@State private var cc = "截图 1"
var body: some View {
VStack {
Text("点击下方按钮进行截图")
.padding()
Button(action: takeScreenshot) {
Text(cc)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
}
.alert(isPresented: $showingScreenshotAlert) {
Alert(title: Text("截图完成"), message: Text("截图已保存至桌面"), dismissButton: .default(Text("确定")))
}
}
class MyStreamOutput: NSObject, SCStreamOutput {
var onCaptureCompletion: (() -> Void)? // 闭包,用于通知截图完成
func stream(_ stream: SCStream, didOutputSampleBuffer sampleBuffer: CMSampleBuffer, of type: SCStreamOutputType) {
// 每当捕获到新的样本帧时打印消息
print("Captured a new frame of type")
onCaptureCompletion?()// 调用闭包通知截图完成
}
}
func takeScreenshot() {
cc = "在截图 1..."
showingScreenshotAlert = true
SCShareableContent.getWithCompletionHandler { (content, error) in
if let error = error {
print("Error: \(error)")
} else if let content = content {
print("Displays: \(content.displays)")
print("Displays: \(content.displays[0])")
print("Displays: \(content.displays[0].width)")
print("Displays: \(content.displays[0].height)")
print("Windows:\(content.windows[23])")
print("Windows ID:\(content.windows[23].windowID)")
print("Windows Count:\(content.windows.count)")
// MARK: - 创建
// 创建一个过滤器以捕获整个屏幕
let filter1 = SCContentFilter(display: content.displays[0], excludingWindows: [])
let config1 = SCStreamConfiguration()
let stream1 = SCStream(filter: filter1, configuration: config1, delegate: nil)
// 实例化我们的输出处理类
let streamOutput = MyStreamOutput()
// 定义截图完成时的动作
streamOutput.onCaptureCompletion = {
DispatchQueue.main.async {
cc = "截图完成了"
print("-----------")
}
}
// 添加输出
do {
try stream1.addStreamOutput(streamOutput, type: .screen, sampleHandlerQueue: DispatchQueue.main)
print("流输出已成功添加")
} catch {
print("添加流输出时出错: \(error)")
}
stream1.startCapture { error in
if let error = error {
print("Failed to start capture: \(error)")
} else {
print("Capture started successfully!")
}
}
}
}
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.