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

MacOS平台Python提词器Overlay屏幕共享与截图隐藏问题求助

MacOS 提词器 Overlay 屏幕共享/截图隐藏方案

核心思路

MacOS 原生提供了专门的窗口属性 kCGWindowExcludeFromCapture,只要给你的 Overlay 窗口加上这个属性,系统级的屏幕捕获(包括截图、会议软件的屏幕共享)就会自动跳过这个窗口,完全匹配你的需求。

修改后的可运行代码

下面是基于 Quartz/Cocoa 思路,添加了捕获排除逻辑的完整示例:

import objc
from Cocoa import NSWindow, NSBorderlessWindowMask, NSBackingStoreBuffered, NSColor, NSApplication, NSView, NSTextField, NSFont
from Quartz import CGWindowListSetWindowProperty, kCGWindowExcludeFromCapture

class OverlayWindow(NSWindow):
    def initWithContentRect_styleMask_backing_defer_(self, rect, style, backing, defer):
        self = super().initWithContentRect_styleMask_backing_defer_(rect, style, backing, defer)
        if self:
            # 基础窗口配置:无边框、置顶、透明背景
            self.setLevel_(3)  # 比状态栏层级高,确保提词器始终在最上层
            self.setOpaque_(False)
            self.setBackgroundColor_(NSColor.clearColor())
            
            # 关键步骤:给窗口添加排除捕获属性
            window_cg_id = self.windowNumber()
            CGWindowListSetWindowProperty(
                window_cg_id,
                kCGWindowExcludeFromCapture,
                objc.YES
            )
        return self

if __name__ == "__main__":
    app = NSApplication.sharedApplication()
    
    # 定义窗口位置和大小(可根据需求调整)
    window_rect = ((600, 150), (500, 120))
    overlay = OverlayWindow.alloc().initWithContentRect_styleMask_backing_defer_(
        window_rect,
        NSBorderlessWindowMask,
        NSBackingStoreBuffered,
        False
    )
    
    # 添加提词器文本组件
    content_view = NSView.alloc().initWithFrame_(window_rect[0])
    text_display = NSTextField.alloc().initWithFrame_(((0, 0), (500, 120)))
    text_display.setStringValue_("这是测试提词内容")
    text_display.setEditable_(False)
    text_display.setOpaque_(False)
    text_display.setTextColor_(NSColor.whiteColor())
    text_display.setFont_(NSFont.systemFontOfSize_(30))
    
    content_view.addSubview_(text_display)
    overlay.setContentView_(content_view)
    
    overlay.makeKeyAndOrderFront_(None)
    app.run()

关键细节说明

  • kCGWindowExcludeFromCapture:这个属性是 Quartz 框架提供的系统级标记,设置后无需额外监听共享状态,系统会自动处理排除逻辑。
  • 窗口层级:保持原有置顶设置不影响提词器的正常显示,同时不干扰捕获排除的生效。
  • 验证方法:
    • 打开 Zoom/Teams 等会议软件进行全屏共享,Overlay 不会出现在共享画面里
    • 按 Shift+Command+3 截图,截图中不会包含提词器内容

排查要点

  1. 确认窗口ID正确:self.windowNumber() 是获取当前窗口的 CGWindowID,必须正确传递给 CGWindowListSetWindowProperty。
  2. 系统版本要求:这个属性支持 MacOS 10.15 及以上版本,如果你的系统版本过低,需要升级系统,或者额外监听屏幕共享状态来动态隐藏窗口。
  3. 避免第三方框架干扰:你提到 PyQt/Tkinter 冗余,用原生 Quartz/Cocoa 是正确的选择,不要混用其他UI框架导致属性失效。

内容的提问来源于stack exchange,提问作者Dileep Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:30:12