惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Google Online Security Blog
Google Online Security Blog
Engineering at Meta
Engineering at Meta
U
Unit 42
Security Latest
Security Latest
G
Google Developers Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
D
Docker
T
Tailwind CSS Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
云风的 BLOG
云风的 BLOG
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
S
Security Affairs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
N
News and Events Feed by Topic
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
S
Securelist
IT之家
IT之家
P
Palo Alto Networks Blog
D
DataBreaches.Net
Help Net Security
Help Net Security
N
Netflix TechBlog - Medium
B
Blog RSS Feed
AWS News Blog
AWS News Blog
Scott Helme
Scott Helme
爱范儿
爱范儿
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
I
Intezer
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
Microsoft Security Blog
Microsoft Security Blog
人人都是产品经理
人人都是产品经理
G
GRAHAM CLULEY
N
News | PayPal Newsroom
博客园 - 三生石上(FineUI控件)
A
Arctic Wolf
F
Fortinet All Blogs
The Register - Security
The Register - Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园 - 【当耐特】

Swift

都 vibe coding 了,为啥不把 Rust 项目 rewrite 到 Swift ? 应该怎么解读 swiftui 的崩溃报告? FoundationModels 框架实践 - V2EX Swift DocC 构建的博客 - V2EX Swift server 要支棱起来了 - V2EX 求问贴,如果在 swiftUI 中接入 MySQL C client - V2EX Swift 萌新, DispatchQueue 的一个问题 - V2EX 分享一下一个 Web 前端刚学习 Swift 时候的心得博文 - V2EX 5 分钟用 Swift 写个 ripripgrep - V2EX Swift 操作 plist 文件 使用 SwiftUI + TCA 重构 Instagram Clone:从 Flutter 到 SwiftUI 的迁移实践 激发编程激情,轻松掌握 Swift SwiftUI 分享个基于 UICollectionView 封装的数据驱动和声明式组件库 ListKit 问一个关于 CALayer 的资源释放问题 SwiftUI 的 TextEditor 在 macOS Sequoia 15.0 上输入中文时又会这样一跳一跳的了 Swift 中系统 API delegate 参数一定要在当前类实现传 self 吗 似乎 SwiftUI app 在 macOS 15 上启动速度变快很多? - V2EX 请教一个关于 Swift 的基础小问题 - V2EX 离线 iOS app 也需要 ICP ? - V2EX 请教 SwiftUI 布局的问题 - V2EX ios 17 widget 无法正确更新 core data - V2EX 有没有 Swift ui 版本的 tailwind css? - V2EX swiftui 里,这里用 hstack,为什么是垂直布局,而不是水平布局? - V2EX 大家觉得 Swift 的参数必须按序提供怎么样? - V2EX Swift 开源的组件库好像不是很多啊 - V2EX Swift 如何像 Python 那样 崩溃了输出 backtrace 或者至少是哪行出错了。。。 - V2EX 请教一下各位 iOSer 巨佬们一个 SwiftUI sheet 组件的问题 - V2EX 请教一下各位 iOSer 巨佬们一个 SwiftUI 中 HStack 的布局问题 - V2EX swiftui 有好用的组件库吗? - V2EX 求问:苹果手机是否无法像安卓一样,可以扫描出本地的音乐? - V2EX macOS 沙盒中如何获得对任意目录的写权限? - V2EX swiftui 中的语法糖疑问 - V2EX 开发 macOS 应用无法访问用户选择的文件夹下的文件 - V2EX 弄了一个 Swift 官方教程的速览版 - V2EX 2024 年了,现在学 SwiftUI 还有必要学 UIkit 吗? - V2EX 大佬们指点下苹果生态下音频相关的这些库都是什么关系? - V2EX 升级到 Xcode 15 之后遇到的 GeneratedAssetSymbols 过不了编译这个问题 - V2EX 现在用 Swift 开发后端成熟了吗? - V2EX Composable SwiftUI - V2EX 2023 年, swiftui 使用 WKWebView 加载 html 字符串,如何自适应 frame 高度? - V2EX 用 network extension 框架开启 Tunnel,怎么能保持后台请求接口,解决请喝杯咖啡 - V2EX 学生党求问各位大佬,一个关于 ios 小组件的问题 - V2EX 比较好的 Swift UI 学习交流群 - V2EX CAID 这垃圾东西是谁在推,一边喊着保护隐私,一边想着法子来跟踪用户 - V2EX Swift 的 Optional 如何比较包装类型的关系呢? - V2EX Alamofire 推荐使用吗? - V2EX 我自己是初学者想找个朋友带我一起写两个工作用的 app 有偿的 - V2EX Swift 如何优化数据加载方式? - V2EX 现在感觉 Swift 真的被 OC 拖后腿了 - V2EX
ScreenCaptureKit 里面的 SCStreamOutput 没有被顺利触发,是那个步骤错了,求解惑 - V2EX
happydoze · 2024-09-20 · via Swift

代码如下:

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!")
                    }
                }
            }
        }
        
    }
    
}