【免费下载链接】interview-coder-cn
AI 截屏解题助手,考试助手,在「面试」或「在线考试」时,借助AI实时提供解题思路和答案。
Interview Coder CN 是一款面向编程面试与在线考试的开源 AI 截屏解题助手,它的招牌能力就是窗口隐身:面试官要求屏幕分享时,助手窗口在你自己屏幕上照常显示,对方却看不到。这篇文章带你拆解隐身背后的两个核心机制——setContentProtection与 WebRTC 窗口枚举,看懂它们为什么能"骗过"屏幕分享软件。
一、先搞清楚:屏幕分享有两条"偷看"路线 🕵️
屏幕分享软件拿到你屏幕内容的方式其实有两条完全不同的路径,隐身设计必须把两条路都堵住:
| 路线 | 原理 | 典型场景 | 对方能看到什么 |
|---|---|---|---|
| 整屏采集(像素级) | 把整个屏幕的像素读走 | 会议里选"共享此屏幕" | 窗口区域内的画面内容 |
| 窗口枚举(列表级) | 遍历系统窗口列表让用户挑选 | 会议里选"共享此窗口" | 窗口的标题和存在本身 |
- 前者针对窗口的"内容",需要让画面变黑;
- 后者针对窗口在列表中的"存在",需要让它不出现在列表里。
setContentProtection只能解决前一个问题,解决不了后一个——所以两个机制必须配合:一个管像素,一个管列表。
二、第一道防线:setContentProtection 像素级"打码"
setContentProtection(true)是 Electron 为BrowserWindow提供的 API:开启后窗口在用户屏幕上显示一切正常,但任何屏幕采集(GDI / DXGI / ScreenCaptureKit 等)经过该窗口区域时,拿到的都是一块黑屏。
项目把这个调用统一封装成 applyContentProtection(),并覆盖应用的全部三个窗口:
- 主窗口:窗口就绪显示时开启(main-window.ts),之后每次重新显示都会再开一次(L85-L87)
- 悬浮工具条窗口:toolbar-window.ts
- 截图框选窗口:region-picker.ts
平台底层机制不同,效果一致:macOS 上把窗口共享类型设为NSWindowSharingNone(禁止系统共享),Windows 上走 DWM(桌面窗口管理器)的受保护内容通道。最终结果就是:采集端看到黑块,用户本人看到正常内容。
export function applyContentProtection(window: BrowserWindow, forceReset = false): void { if (!window || window.isDestroyed()) return if (forceReset && process.platform === 'win32') { window.setContentProtection(false) } window.setContentProtection(true) }💡
forceReset参数是 Windows 平台的小坑:该平台上窗口经过移出屏幕等操作后,受保护状态可能失步,必须先"关一次再开一次"(false → true)才能确保生效。
三、Windows 平台的重置姿势:为什么每次显示都要"重设一次"
在 shortcuts.ts 中,每次显示主窗口都会重新应用内容保护,并且 Windows 上固定传入forceReset = true:
window.showInactive() applyContentProtection(window, process.platform === 'win32')同样地,从"软隐藏"状态恢复窗口时,会先执行 applyContentProtection(window, true) 重置保护,再把窗口移回原位。这个"先重置再设置"的动作,就是为了防止 Windows 平台的受保护状态丢失,导致窗口以正常内容出现在对方的共享画面里。
四、第二道防线:空窗口标题骗过 WebRTC 的窗口枚举
第二道防线针对"共享此窗口"。Edge / Chrome 的"共享窗口"选择器由 Chromium 的 WebRTC 屏幕采集实现,它遍历窗口时带有kIgnoreUntitled标志——标题为空的窗口会被直接从候选列表里丢弃。
Interview Coder CN 正是利用这条规则:让主窗口的原生标题永远为空。创建窗口时设置title: ''(main-window.ts),并拦截页面标题更新事件,即使网页里的document.title变化,原生窗口标题也保持为空:
mainWindow.on('page-title-updated', (event) => { event.preventDefault() mainWindow.setTitle('') })效果:对方浏览器的共享窗口列表里永远不会出现这个"无名窗口",助手在列表层面被直接过滤掉。截图框选窗口也用了同样的空标题技巧(region-picker.ts)。
这里有个巧妙的"零成本"前提:窗口本身就是无边框的,标题从不绘制,所以保持标题为空没有任何视觉代价。
五、配套细节:让窗口"无处露脸"的其余设置
除了两个核心机制,窗口创建时还配了一组"低调"参数(完整说明见 AGENTS.md 的 Window Stealth 章节与 main-window.ts):
| 设置 | 作用 |
|---|---|
frame: false+transparent: true | 无边框、透明、无阴影,减少"视觉存在感" |
skipTaskbar: true | 不出现在任务栏,对方无从点选 |
hiddenInMissionControl: true | macOS 调度中心里不露面 |
macOStype: 'panel' | 面板窗口可浮于其他应用的全屏 Space 之上 |
setVisibleOnAllWorkspaces(...) | 跨虚拟桌面、在他人全屏应用之上保持可见 |
showInactive() | 显示窗口但不抢焦点,做题页面不失焦 |
keepWindowInFront() | 显示后 8 秒内每 100ms 重申一次置顶,之后转为低频守护(shortcuts.ts) |
另外,Windows 上的"隐藏窗口"快捷键用的是"软隐藏":把窗口移到屏幕外 2000 像素、透明度置 0 并开启鼠标穿透(shortcuts.ts),随时可以恢复——这是属于用户自己的"逃生门",与上述两道隐身机制相互独立。
六、隐身不是万能的:正式使用前这样验证 ⚠️
坦白说:隐身功能适配市面上大部分主流会议软件(如腾讯会议等),但很少部分软件和浏览器的屏幕采集实现不同,可能无法正常隐身。官方 README.md 特别提醒:务必在正式使用前,用「当前电脑」+「当前会议软件」自行测试。
验证清单:
- 打开助手,让解答窗口出现在做题页面上;
- 发起会议并选"共享此屏幕",看对方画面里助手窗口区域——应为黑块或完全不可见;
- 改为"共享此窗口",检查窗口列表里是否出现助手窗口——不应该出现;
- 会议软件的全屏 / 窗口两种形态都测一遍,个别软件全屏采集行为不同。
本项目仅供学习与研究使用,请遵守考试、面试等场合的相关规定,使用本软件产生的一切后果由使用者自行承担。
七、相关文件索引 🔍
想深入阅读?核心代码集中在 Electron 主进程的窗口管理里:
- 主窗口创建与内容保护:src/main/main-window.ts
- 悬浮工具条窗口:src/main/toolbar-window.ts
- 截图区域框选窗口:src/main/region-picker.ts
- 显示/隐藏、软隐藏与置顶守护:src/main/shortcuts.ts
- 架构与开发约定总览:AGENTS.md
【免费下载链接】interview-coder-cn
AI 截屏解题助手,考试助手,在「面试」或「在线考试」时,借助AI实时提供解题思路和答案。
相关推荐
为什么面试官看不到你?Interview Coder CN 屏幕分享隐身能力全解析
为什么面试官看不到你?Interview Coder CN 屏幕分享隐身能力全解析 Interview Coder CN 是一款支持 屏幕分享隐身 的 AI 面
Interview Coder CN 鼠标穿透与窗口置顶原理:为什么做题页面从不失焦
Interview Coder CN 鼠标穿透与窗口置顶原理:为什么做题页面从不失焦 Interview Coder CN 是一款 AI 截屏解题助手,在面试或
Interview Coder CN 截屏解题助手完全指南:面试与在线考试如何靠隐身 AI 实时解题?
Interview Coder CN 截屏解题助手完全指南:面试与在线考试如何靠隐身 AI 实时解题? Interview Coder CN 是一款开源的截屏解
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考