我用 Tauri 做了一个约 1.5 MB 的开源屏幕标注工具:MarkerOn

作者自荐:MarkerOn 是我正在维护的开源项目。本文既介绍产品,也复盘透明覆盖层、穿透模式与多窗口协作的实现取舍。

做课堂演示、会议讲解、软件 Demo 或录屏时,我经常遇到一个很小、但会反复打断节奏的问题:想在当前屏幕上圈一个按钮、画一条箭头或临时写两个字,却要先截图、切到编辑器、标完再贴回去。

我想要的体验其实只有一句话:按下快捷键,整个桌面立刻变成画布;讲完按 Esc,继续工作。

于是有了 MarkerOn------一个基于 Tauri v2、Rust、Vue 3、TypeScript 与 Canvas API 的开源屏幕标注工具。它支持 Windows 和 macOS,安装包约 1.5 MB,不需要账号,也没有云端依赖。

源码:github.com/ifer47/mark...

从快捷键开始,而不是从一个窗口开始

MarkerOn 平时安静地待在系统托盘,不先弹一个主窗口。Windows 下按 Ctrl+Shift+D,macOS 下按 Command+Shift+D,透明标注层才会出现。

进入后,数字键可以直接切换画笔、荧光笔、箭头、矩形、椭圆、直线、橡皮擦和激光笔,T 是文字,Q/E 切换颜色,Ctrl/Command + 滚轮 调整线宽,Space 呼出工具栏。

这个设计不是为了"炫快捷键",而是因为讲解过程最怕打断。鼠标正在指着重点时,再把它移到一排按钮上,会让听众丢失注意力。键盘优先的意义,是把界面藏到需要它的时候。

透明覆盖层:看得见标注,看得见下面的软件

桌面标注的基础是一个透明、无边框、置顶的覆盖窗口。Tauri 负责窗口生命周期与跨平台能力,Rust 后端处理全局快捷键、托盘、窗口层级、截图和平台差异,Vue 与 Canvas 负责绘制交互。

覆盖窗口看起来像"什么都没有",但它必须同时解决几件互相拉扯的事:

  1. 盖住桌面和应用,保证笔迹始终可见。
  2. 在绘制时接收鼠标和键盘事件。
  3. 不把系统任务栏、独立工具栏或截图流程弄乱。
  4. Windows 与 macOS 的窗口层级和输入行为不能互相套用。

因此,MarkerOn 没有把所有东西塞进一个 WebView。绘制覆盖层和独立工具栏是两个窗口,二者通过事件与命令同步当前工具、颜色、线宽、撤销历史、白板状态和穿透状态。

穿透模式:标注留着,鼠标继续操作下面的软件

MarkerOn 最有辨识度的功能是穿透模式。

假设我先圈出网页上的一个按钮。普通标注工具往往要求退出标注,圆圈也随之消失;MarkerOn 可以按 X 切到穿透模式:笔迹继续显示,但点击、滚动与输入会到达下面的网页。需要补一条箭头时,再按一次 X 回到绘制。

实现上,这不是把 Canvas 设成 pointer-events: none 就结束了。桌面覆盖层本身是原生窗口,真正的穿透需要后端切换窗口是否忽略光标事件。与此同时,独立工具栏仍要能接收点击,工具栏抢到焦点后还要避免覆盖层误判状态。

MarkerOn 因此把"绘制窗口是否接收事件""工具栏是否置顶""鼠标是否位于工具栏区域""白板模式是否允许穿透"等状态拆开管理。白板模式本身没有下层应用可操作,所以会禁用穿透,避免出现看似可点、实际上语义不成立的状态。

Canvas 绘制:历史、预览和激光笔是三种不同问题

画笔、直线、矩形和椭圆都可以画在 Canvas 上,但它们的交互并不相同。

自由曲线需要连续采样并平滑;形状工具在拖动过程中需要预览,松开鼠标后才进入历史;文字要处理输入框、确认、二次编辑;橡皮擦既可以局部擦除,也可以删除整个对象;撤销与重做不能只保存一张位图,否则很难继续编辑已有元素。

激光笔又是另一类:它不是永久笔迹,而是带时间衰减的临时轨迹。MarkerOn 使用 Excalidraw 风格的可变宽轮廓来渲染激光轨迹,并让旧位置逐渐淡出。它更接近"引导视线",而不是"往画布上再加一种颜色"。

截图时,工具栏不应该被拍进去

用户按 Ctrl/Command+C 复制带标注的屏幕时,独立工具栏如果也在最上层,就很容易跟着进入截图。

MarkerOn 会在截图流程中临时排除或隐藏工具栏,完成捕获后再恢复。Windows 可以使用窗口显示亲和性等系统能力,macOS 则需要配合原生窗口行为处理。这类问题在普通网页应用里几乎不存在,却是桌面覆盖层工具必须面对的细节。

约 1.5 MB,不等于"功能越少越好"

选择 Tauri 的一个直接收益是体积。MarkerOn 不打包完整浏览器内核,而是使用系统 WebView;Rust 处理原生能力,前端只承担绘制与设置界面。

但轻量不只是安装包数字。MarkerOn 也尽量不要求登录、不启动云服务、不把屏幕内容上传到服务器。对讲课、录屏和企业演示来说,这种本地优先比"再多几个模板"更重要。

v2.2.0 还新增了官方 Windows 绿色免安装版。下载 zip 解压后即可运行,配置保存在程序旁边的 data\ 目录,不写 AppData,适合放进自己的工具目录或 U 盘。

还没有解决完的问题

桌面覆盖层最难的部分通常不是第一版,而是现实设备组合:多显示器、混合 DPI、数位板、触屏、手写笔、macOS 窗口层级,以及某些全屏视频应用的特殊行为。

这些场景目前仍在持续改进。我不想把"支持 Windows / macOS"写成"所有设备上都已经完美",所以如果你愿意测试,最有价值的反馈不是一句"好用",而是:

  • 系统版本、显示器数量与缩放比例
  • 输入设备是鼠标、触屏还是数位板
  • 哪个应用上出现了窗口层级或快捷键问题
  • 能稳定复现问题的最短步骤

MarkerOn 的设置页可以导出诊断报告,问题可以直接提交到 GitHub Issues。

现在就可以试

如果你平时会讲课、做产品演示、录教程,欢迎拿真实场景来试。也欢迎关注透明覆盖层、跨平台窗口与 Canvas 绘制实现的开发者一起讨论。

相关推荐
爱分享的程序猿-Clark1 小时前
【前端分享】vue开发项目,如何实现 从A页面跳转到B页面,并传值!
前端·javascript·vue.js
徐小夕2 小时前
花了3天,我写了一款开源AI公众号编辑器
前端·vue.js·github
come112343 小时前
Vue 2 与 Vue 3 语法区别及使用技巧
前端·javascript·vue.js
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:ERP 企业资源模块,一个轻量级进销存的完整实现?
前端·javascript·vue.js·人工智能·前端框架·产品经理·ai编程
Simon_He3 小时前
AI 对话里的流式 Markdown 为什么难:从不完整 Token 到增量渲染
vue.js
2601_954526753 小时前
【硬核架构】打破 IT 与 OT 的数据孤岛!基于 Rust 异步协程的工业 IoT 网关重构,兼谈顶级自动化智能仪表厂家选型指南
物联网·架构·rust
达子6663 小时前
第4章_图解HarmonyOS 的结构
vue.js
white_ant4 小时前
17- 文本统计/处理工具使用指南
rust·个人开发·tauri
独孤留白4 小时前
Rust 类型转换全景指南 —— 从引用转换到序列化
rust