一个在局域网里跨设备搜题的小工具。它把「截屏 → 多模态 AI 读题 → 显示答案」这条链路做成两端协同:
电脑截屏(热键 / 悬浮球 / 剪贴板)
│
▼
多模态 AI 读题(题目 / 选项 / 材料 / 主观题结构化)
│
├──────────────► 电脑端:当场显示答案与解析、可标绿、可导出
│
└──── 局域网 ──► 手机端:自动刷新出同一条结果,可离线回看
手机截屏(悬浮球 / 相册选图)
│
▼
上传到电脑 → 电脑端 AI 分析 → 结果回传手机(电脑端同步留档)
典型场景:电脑上做网课作业 / 题库练习,想快速看答案与解析;或者用手机对着题目截一张屏(或从相册选一张已经拍好的图)上传给电脑上的 AI —— 两边看到的永远是同一份结果。
答案由 AI 生成,仅供参考;请遵守所在学校 / 机构关于作业与考试的规定。
| 能力 | 说明 |
|---|---|
| 全局热键截屏搜题 | 三个可自定义的热键:截屏识别 / 追加一页 / 结束多页识别;默认组合键可随时改,被别的软件占用会自动回退并给出提示 |
| 桌面悬浮球 | 常驻桌面最上层的小圆球:单击截一张图直接识别(正在攒页时 = 收尾识别);按住 0.5 秒或右键追加一页进入多页模式。可拖动、松手自动吸附屏幕左右边缘;大小、透明度、描边都可调,三种状态三种颜色(待识别 / 识别中 / 多页模式) |
| 多页识别 | 一道大题分好几屏(题干 + 材料 + 图)时,逐页「追加」,最后「结束」一次性提交,AI 按页序整体读题;题目顺序由模型自行纠正 |
| 剪贴板监听 | 复制一张图(截图工具、浏览器、看图软件都行)就自动识别,不用切窗口 |
| 拖入 / 粘贴 | 图片文件直接拖进主界面,或 Ctrl+V 粘贴 |
| 结果页 | 一次识别的所有题目在同一页纵向显示;命中选项标绿、不确定的标黄;阅读材料默认折叠、可展开;可展开「原始返回」排查解析问题 |
| 历史记录 | 按「任务合集」分组,可二次确认后删除;支持关键词搜索历史题目(题干 / 解析,FTS5);支持 Markdown / JSON 导出、合集导出、一键备份与恢复 |
| 托盘常驻 | 关闭窗口 = 隐藏到托盘,不退出;托盘菜单可直接截屏、追加页、切换合集、打开设置 |
| 内置服务端 | 电脑端自带局域网服务(HTTP + WebSocket),手机端通过配对码 / 二维码连上来,无需另装服务 |
| 示例1 | 示例2 | 示例3 |
|---|---|---|
![]() |
![]() |
![]() |
| 能力 | 说明 |
|---|---|
| 当前任务 | 手机默认就是「电脑识别结果的显示器」:显示与电脑的连接状态(「已连接 · 合集名」)与正在识别的图片张数,出结果后自动跳到本次结果页 |
| 悬浮球 | 常驻在别的应用之上:单击截屏上传分析;长按进入多页模式(一次长按加一页,最后短按收尾);可拖动、自动吸附边缘 |
| 相册选图搜题 | 从相册挑一张图上传到电脑分析 |
| 结果页 | 与电脑端同一套题目卡片;「上一次 / 下一次识别」在多次识别之间切换、字号可调、可请求电脑「重新生成」 |
| 历史记录 | 按合集分组、可离线查看(数据本来就在手机上),支持删除 |
| 静默采集 | 手机自己发起的识别全程不打扰:不跳页、不切标签、不把界面拉到前台,进度只反映在「当前任务」页与通知里 |
- 电脑发起识别:手机 1 秒内看到「N 张图片识别中…」,出结果后自动跳到本次结果页;如果手机正停在某次结果页上,页顶会浮出一条「电脑正在识别中…/识别完成,正在打开新结果…」。
- 手机发起识别:结果落回手机并同步到电脑端,全程静默。
- 电脑上新建 / 改名合集、新增识别结果:手机在前台时 1 秒内跟着变;电脑上删掉的合集在手机端会保留(手机端自己删的合集会同步给电脑)。
- 断线也没关系:手机有离线队列,重新连上会自动补跑并补齐。
| 项 | 要求 |
|---|---|
| 电脑 | Windows 10 / 11(64 位)。电脑与手机需要在同一个局域网(同一个路由器 / 同一个 Wi‑Fi)。VC++ 运行库已随包提供,无需另外安装 |
| 手机 | Android 8.0 及以上(minSdk 26),arm64 / armeabi-v7a / x86_64 三种架构都有对应安装包 |
| AI 服务 | 需要自备一个支持图片输入的多模态模型 API Key(默认已按 DeepSeek 官方接口填好模型名与地址,通常只要粘一个 Key) |
| 权限 | 手机端需要相机(扫码配对)、通知、悬浮窗、截屏授权(首次使用时按引导授权即可) |
两种包任选其一,功能相同:
- 便携版:解压
quizsync-windows-portable-*.zip到任意目录,双击quizsync_desktop.exe。数据(数据库、截图、日志)就放在软件目录下的userdata\,拷走整个目录即搬走全部数据。 - 安装版:运行
quizsync-windows-setup-*.exe,会创建开始菜单与桌面快捷方式,卸载不会删除你的数据目录。
首次启动如果 Windows 防火墙询问是否允许访问网络,请选择允许(只在局域网内使用)。
安装 quizsync-android-<架构>-*.apk:
| 文件 | 适用机型 |
|---|---|
arm64-v8a |
近几年绝大多数手机(首选) |
armeabi-v7a |
较老的 32 位机型 |
x86_64 |
模拟器 / x86 平板 |
⚠️ 装过早期版本的手机,请先卸载旧版再装:包名已从com.example.quizsync_android改为com.quizsync.android。系统把两者当作两个不同的应用,无法覆盖安装,也不会提示升级。 卸载旧版会一并删掉它的历史记录与配对信息,装好新包后需要重新配对一次。
Android 会提示「未知来源应用」,按系统引导允许一次即可。
- 打开软件 → 左侧 API 配置;
- Provider / 模型名 / Base URL 默认已经按 DeepSeek 官方接口填好(
deepseek-flash+https://api.deepseek.com),通常只要把 API Key 粘进去、点保存; - Key 申请入口就在该输入框下面(
https://platform.deepseek.com/api_keys)。
用别家的多模态模型也可以:把 Provider 切到 OpenAI 兼容 / Anthropic / Gemini,填上对应的模型名、地址与 Key 即可。
识别结果都归属于某个「任务合集」(例如「期末复习」「第三章作业」),方便以后查找与导出。 第一次打开会要求新建一个;每次启动都要重新选一次,避免新记录不小心落进上次的合集。
- 电脑端 连接设备 → 打开时会自动刷新一个二维码和 6 位配对码;
- 手机端首次进入点「开始使用」→ 扫码(或手动输入 6 位码);
- 配对成功后手机自动回到「当前任务」页,并显示「已连接 · 合集名」。
- 通知权限:常驻截屏服务需要(Android 13+ 会弹窗);
- 悬浮窗权限:悬浮球需要;
- 截屏授权:第一次点悬浮球时,系统会弹出「开始录制或投射」之类的确认框,点允许(这是 Android 对截屏的硬性要求,无法跳过);
- 部分机型还需要把应用加入电池优化白名单 / 允许后台弹出界面,否则悬浮球可能被系统清理(设置 → 识别模块设置 → 权限引导里有直达入口)。
- 按截屏热键(默认
Ctrl+Alt+Q;被别的软件占用时会自动回退到Ctrl+Alt+X/Ctrl+Alt+G,以「热键设置」页显示的为准)→ 截取鼠标所在的那块屏幕 → 答案,全程后台静默:不会抢焦点、不会把窗口弹到前台。 - 点桌面悬浮球:在别的应用里也能截,不用切回本程序。
- 多页:按「追加页」热键(默认
Ctrl+Alt+A)逐页攒,最后按「结束多页」热键(默认Ctrl+Alt+S);或直接用悬浮球长按 / 右键追加、单击收尾。悬浮球变绿说明正在攒页。 - 剪贴板:在设置里打开「剪贴板监听」后,复制一张图就会自动识别。
- 结果:成功时界面保持静默,结果写进当前会话,回到主界面就能看到题目与解析;失败(没配 Key、没找到题目、网络不通)会把窗口带到前台并写明原因。
- 把手机当第二块屏:电脑识别时看着手机就行,结果会自动出现(停在结果页上时也会有浮层提示)。
- 手机自己发题:点悬浮球截屏(或「相册选图搜题」)→ 上传到电脑分析 → 结果回传;
- 多页:长按悬浮球加页(球变色表示已进入多页模式),最后短按一次作为最后一页并提交。
| 分类 | 内容 |
|---|---|
| 显示设置 | 主题模式(跟随系统 / 浅色 / 深色)、界面缩放 50%–300%、题目字号与字重 |
| API 配置 | AI 服务供应商、API Key、模型名、Base URL、超时、每日调用上限、今日用量 |
| 连接设备 | 连接状态、监听端口与局域网地址、配对二维码 / 配对码、已配对设备(可吊销) |
| 识别设置 | 剪贴板监听、是否保存图片文件、多页识别页数上限、本地图片缓存上限 |
| 悬浮球设置 | 显示开关、大小、整体透明度、描边(开关 / 宽度 / 不透明度,颜色跟随状态) |
| 热键设置 | 三个用途各自一行:自定义 / 恢复默认;停在本页(且窗口在前台)时按键不会触发截屏,离开或切到别的程序立刻恢复 |
| 数据管理 | 任务合集(切换 / 新建 / 删除 / 按合集导出)、一键备份、恢复备份、导出全部历史、导出日志、打开数据目录 |
| 关于 | 应用名与版本、项目地址、技术栈、字体与开源许可 |
手机端设置项集中在「设置」标签:外观(主题 / 字号)、识别模块总开关与二级页(截屏方式含备选的无障碍截屏、悬浮球开关与外观、一题多页、权限引导)、配对与解除配对、关于。安卓端本地原图固定只留最近 20 张(没有缓存上限设置项;文本结果与元数据永久保留)。
- 只在你自己的设备之间传输:电脑与手机在同一个局域网内直连(HTTP + WebSocket),没有云端中转、没有账号体系,代码里也不包含任何遥测 / 统计。
- 什么会离开你的设备:只有你主动截取或选中的那张图片会发给你自己配置的 AI 服务商(例如 DeepSeek 官方接口)用于识题。除此之外的数据都留在本机。
- API Key 的存放:Key 只存在电脑端,用 Windows DPAPI 加密后落盘,数据库里不存明文;界面上只回显尾 4 位,输入框保存后立刻清空;手机端不保存 Key,只持有一份配对 token(放 Android Keystore),可在电脑端「吊销设备」或手机端「解除配对」立即作废。
- 数据落在哪:电脑端在软件目录的
userdata\(数据库、images\截图、logs\日志、备份与导出);手机端在应用私有目录(对外不可见)。两端都可以一键导出 / 备份。 - 删除与卸载:删除识别记录是软删除(可随备份恢复);电脑端卸载不会删除数据目录(
userdata\要手动删),手机端卸载会连同应用私有数据一起清掉(换机请先在电脑端备份)。 - 局域网访问:服务只监听局域网地址,并用配对 token 鉴权;手机端「解除配对」或电脑端「吊销设备」可立即让旧 token 失效。
| 现象 | 处理 |
|---|---|
| 手机连不上电脑 | 确认两台设备在同一个 Wi‑Fi、电脑端服务已启动(连接设备页有状态与端口);Windows 防火墙放行该端口;若网络开启了「AP 隔离」(公司 / 学校网络常见)会互相不可见,换成手机热点试试 |
| 识别结果一直是「识别中」 | 看电脑端是否弹过错误提示(Key 未填 / 额度超限 / 网络不通);API 配置页的「今日用量」能看到调用情况 |
| 截出来是黑图 | 该应用禁止截屏(视频类、银行类应用常见),换用手机截屏或相册选图上传 |
| 悬浮球不见了 | 手机端:设置 → 识别模块设置 → 权限引导,补授予悬浮窗权限并加入电池白名单;电脑端:设置 → 悬浮球设置 → 打开「显示悬浮球」 |
| 手机端不自动刷新 | 确认手机停在「当前任务」页且电脑端已选合集;手机在前台时每秒会主动问一次电脑状态 |
| 手机上的合集 / 记录和电脑不一致 | 电脑端新建 / 改名 / 新增记录后,手机在前台时 1 秒内会跟上;电脑端删掉的合集在手机端会保留(手机端自己删的合集会同步给电脑);手机刚才在后台的话,回到前台也会自动补齐 |
| 换了电脑 / 重装 | 把旧的 userdata\ 目录拷到新软件目录旁边即可(也可用「数据管理」里的一键备份 / 恢复) |
| 想用别家模型 | API 配置里换 Provider(OpenAI 兼容 / Anthropic / Gemini)并填模型名与地址;必须是支持图片输入的模型 |
- 只支持 Windows + Android 两端(没有 iOS / macOS / Linux 版本)。
- 依赖局域网直连,不支持公网远程使用。
- 系统级禁止截屏的应用只能得到黑图(本工具不做任何绕过)。
- AI 会出错:答案与解析仅供参考,重要场合请自行核对;题目不清、缺页时结果可能不完整(界面会标出「题目不全」与「AI 猜测」)。
- 图片与结果保存在本机,跨设备迁移请用备份 / 导出功能。
- 手机端没有内置拍照入口:想用照片搜题,请先用系统相机拍好,再从「相册选图搜题」导入(或直接点悬浮球截屏)。
apps/desktop Flutter(Windows 桌面端,内置局域网服务端)
apps/android Flutter(Android 端,含极薄的 Kotlin 平台通道)
packages/quizsync_core 纯 Dart 共享核心:协议模型 / drift(SQLite) / 同步引擎 / AI 客户端 / 解析
packages/quizsync_ui 两端共享的 Flutter 组件(题目卡片 / 配色 / 会话导航)
docs/ 协议、数据模型、AI 契约、功能规格等设计文档
tools/ 一键构建与打包脚本
| 层 | 选型 |
|---|---|
| 界面 / 业务 | Flutter 3 · Dart 3 · Riverpod |
| 本地数据 | drift(SQLite,含 FTS5) |
| 端到端同步 | 自研:Lamport 时钟 + 逐字段 LWW + 软删除墓碑 + 离线队列,两端共用同一份实现 |
| 电脑端服务 | shelf(HTTP + WebSocket),配对码 / token 鉴权 |
| 截屏 | Windows:GDI(含剪贴板 DIB 解析);Android:MediaProjection(备选无障碍截屏) |
| 悬浮球 | Windows:原生分层窗口(UpdateLayeredWindow);Android:原生 View + WindowManager(不在浮层里跑第二个 Flutter 引擎) |
为什么不把逻辑分散写:两端最容易出问题的地方是「同一份数据在两边长得不一样」。协议、模型、序列化与同步算法全部放在共享包里,两端跑同一份代码,从结构上消灭这类不一致。
需要 Flutter 3.4x(stable)与对应平台的工具链(Windows 桌面:Visual Studio 生成工具;Android:Android SDK + JDK 17)。
# 依赖(在 packages/quizsync_core、packages/quizsync_ui、apps/desktop、apps/android 下分别执行)
flutter pub get
# 静态检查
flutter analyze
# 构建
cd apps/desktop && flutter build windows --release
cd apps/android && flutter build apk --split-per-abi --release仓库内的设计文档见 docs/:功能规格(SPEC.md)、局域网协议(protocol.md)、数据模型与同步算法(data-model.md)、AI 契约与输出格式(ai-contract.md)。
本源码包不含测试目录(发布版已裁剪):
flutter test/dart test没有用例可跑,tools/build_all.ps1会自动跳过测试步骤。
- 界面字体 MiSans(小米):依官方 FAQ,允许个人与商业免费使用、可随软件嵌入分发,但不得单独售卖 / 再分发字体文件本身,也不得改名后再发布。
- 图标字体 Material Icons:Apache License 2.0。
- 其余第三方依赖的许可证全文可在应用「设置 → 关于 → 第三方组件许可全文」中查看。
- 本项目的代码以 MIT 许可证 开源,可自由使用、修改与再分发(保留版权与许可声明即可)。
- 上表中随包分发的第三方资源(MiSans 字体、Material Icons、KaTeX 字体等)不因本项目开源而改变许可,仍按各自的条款使用。


