InkTeach:基于 .NET 8 与 Direct2D 的屏幕批注原型项目

InkTeach 课堂批注工具 · 国内镜像(源码同步自 GitHub XueRenYi0/InkTeach)

分支1Tags99
文件最后提交记录最后更新时间
15 天前
13 天前
2 天前
2 天前
18 天前
2 天前
4 天前
2 天前
1 个月前
14 天前
1 个月前
7 天前
2 天前
2 天前
7 天前
24 天前
2 天前

InkTeach · Windows 课堂批注

中文 | English

一层透明覆盖层:在 PPT / WPS / 任意软件上直接写板书。 它不是"又一个白板",是一块贴在别人软件上面的板书层——板书写在自己的图层里, 底下那个 PPT 一点没动,点一下就把鼠标还给 PPT。

Release License Platform Downloads

下载:GitHub Releases(InkTeach-Setup-<版本>.exe 双击下一步, 或绿色版 InkTeach-<版本>-win-x64.zip 解压即用)|GitCode 国内镜像 |官网:https://xuerenyi0.github.io/InkTeach/

最新 9.4.4(2026-10-29):自动更新更稳了——换壳前先确认旧进程已退出、更新包根目录确实有 InkTeach.exe,解压后再校验一次;从 .old 备份启动时改为更新稳定主目录,不再套娃。 新版本启动 5 秒后会自动清理同目录遗留的 *.old-*,绿色版和安装版都清;安装包卸载时也会 一并删掉这些旧备份。原有下载、校验、换壳流程不变,不影响用户更新。 完整更新见 发版历史。

演示:手写一个圆 → 停顿变图形 → 选中拖动 → 截图取景


30 秒上手

  1. 下 InkTeach-Setup-9.4.4.exe,双击 → 下一步 → 完成;不想安装就用绿色版 zip。
  2. 打开 PPT / WPS 放映,或任意软件;底部就是 InkTeach 工具带。
  3. 直接用手写笔/鼠标写。按 Ctrl+L 切激光笔,Ctrl+E 切橡皮,Ctrl+Alt+Shift+T 把鼠标还给下层软件。
  4. 想换工具又不想找面板:按住 Ctrl+Alt+Shift+Q,在光标处划向扇区,松手切换。

数学老师最常用:函数图像 + 立体几何

不是“能画图”,而是每个定义元素都能直接拖:抛物线换开口、双曲线看渐近线、圆柱/圆锥改比例,拖动时实时显示角度 / 半径 / 长度。

  • 函数图像:抛物线四个开口方向、双曲线(可带渐近线)、正弦 / 余弦 / 正切 / 波浪线、坐标系。
  • 圆锥曲线:双曲线有 / 无渐近线,椭圆有 / 无焦点,适合同页对比。
  • 立体几何:圆柱 / 圆锥 / 圆台 / 球,棱柱 / 棱锥 / 棱台;底面、顶点、母线都能拖。

抛物线四个方向、双曲线、正弦余弦等函数图像

双曲线有/无渐近线、椭圆有/无焦点对比

圆柱、圆锥、圆台、球、棱柱、棱锥、棱台

特色:这几个地方,市面上的批注软件基本没做

① 色带——平时是一条 6 像素的线,用的时候才长成设置条

工具选中以后,它头顶那条设置条不是一直摊着的,而是压成 6 像素的一条色线; 鼠标碰到它,用 120ms 张开到 34 像素的完整设置条(色板 / 线型 / 粗细 / 档位…), 移开之后等 450ms 才收——"快出慢隐",是 Windows 任务栏自动隐藏那一套手感。

压成线以后仍然可以直接点:8 个色片压成 6 像素还是能点,不用先展开再选 (挑颜色是最高频动作,逼着人"两步"就等于不好用)。

主工具带:上方是当前工具的设置条,下方是工具带

色带收起:平时只是工具带上沿那条 6 像素色线

② 贴边隐藏——藏起来只剩一条 48 像素的把手

把工具带拖到屏幕底边,它会缩到只剩一条把手(长 48、厚 8,颜色就是当前笔色)。 48 这个长度是有理由的:仓库里另一条规矩写着"48 是点得到的最小东西,触摸屏上也够", 而藏起来的时候恰恰是最需要一次点中的时候——教室里没键盘,工具找不到是真问题。

贴边判定用的是"离屏幕底 ≤10 像素",不是离任务栏上沿——所以默认位置不会误触发, 要收起来必须明确把面板拖到最底下,这个手感是量出来的不是猜的。

贴边隐藏:露着的时候是一个圆钮(左),拖到屏幕底边隐藏后只剩一条 48×8 的把手(右)

③ 呼出盘——按住一个全局键,划向扇区,松手切

Ctrl+Alt+Shift+Q(全局键,任何程序在前台都生效):按住不放,光标处浮出八扇面, 划向要的功能,松手执行。八扇区(北起顺时针)= 红笔 / 荧光笔 / 下一色 / 框选 / 橡皮 / 清屏 / 上一色 / 撤销;中央是当前功能图标 + 颜色环,划到哪格就实时预览。

  • 红笔固定在正北;东西两格是上一色 / 下一色(红的两边正好是黑和蓝)。
  • 清屏在西南角,停住 0.8 秒才执行(只清当前页);撤销在西北角。
  • 盘不再 5 秒自动消失:一直留到松手 / 点选 / 点空白 / Esc(9.4.0 起)。
  • 熟手不用等盘:出盘有 120ms 延迟,直接划走盘根本不闪。
  • 开着穿透也能按——它是"把笔从下层抢回来"的入口:选一个扇区就退出穿透并切到它, 想继续用下面的程序就把鼠标松在盘心(只是取消,穿透不动)。
  • 它不新增任何命令:扇区里的动作和工具键走完全同一条路,不会两套逻辑跑偏。

呼出盘:按住全局键,光标处浮出八扇面(深色主题)

④ 穿透 + 全局键:能"过手",也能"抢回来"

点一下「鼠标」那格(或全局 Ctrl+Alt+Shift+T)鼠标就还给下层程序,可以正常去点 PPT。 这时候想写字,不用去找工具带——全局键直接把人拉回来:呼出盘换工具、 穿透开关退出、退出程序同理。直接退出穿透会回到画笔(9.3.2 起),不用再点一次笔格; 穿透里点笔 / 荧光笔 / 橡皮等工具格,则切到点的那一个。全局键统一是 Ctrl+Alt+Shift+… 三层修饰, 就是为了不和别的软件撞车(完整清单见文末"快捷键(摘要)")。

⑤ 停顿成图形:手写一笔,停住 0.4 秒,它自己变规整

手写一个歪圆,笔尖停住约 400ms,它变成一个规整的圆;按住还能拖到位再松手。 直线、矩形、三角形、平行四边形同理。吸附和"用图形工具画直线"是同一套 (特殊角软吸附 ±1°、Shift 15° 硬网格、Alt 自由)。

⑥ 22 种图形:从函数图像到立体几何

直线 / 箭头 / 矩形 / 椭圆 / 圆 / 三角形 / 平行四边形 / 坐标系; 抛物线 / 双曲线 / 正弦 / 余弦 / 波浪线 / 正切;圆柱 / 圆锥 / 圆台 / 球 / 棱柱 / 棱锥 / 棱台。

每个定义元素都是可以直接拖的手柄(端点、半轴、顶点、焦点、渐近线…), 拖的时候有特殊形状吸附(正方形、正圆、姿态角),并实时显示角度 / 半径 / 长度读数。

图形的设置条:22 段,含圆锥曲线与立体图形

图形库总览:22 类图形,每一类都有多档变体(实线 / 虚线 / 点线、带网格 / 不带…)

学科图形:四种开口的抛物线、双曲线、正弦 / 余弦 / 波浪线、正切,以及圆柱 / 圆锥 / 圆台 / 球

⑦ PPT 逐页隔离:翻页只看这一页,每页都记得

进放映自动进入、退出自动回桌面页。每一页的墨迹完全隔离,页内还能滚动、 每页记住滚到哪;自动存 / 自动读,支持回放本页墨迹(把这一页的书写过程重放一遍)。 连不上 PowerPoint / WPS 时零症状——不联动而已,不报错、不卡、不弹窗。

⑧ 深色主题:不是"把颜色反过来",是整套一起重调

深色档覆盖工具带、浮动面板、悬停提示、PPT 控件条和课堂窗。深浅两套是分别调过的: 浅色靠"底沿一道暗边"读出厚度,深色靠"顶沿一道高光"读接光——把深色那套直接反相, 层次感会整个塌掉。

动图:深色主题下,色带收起是一条线,鼠标碰到张开成设置条

深色主题的工具带

深色主题的「更多」面板    深色主题的计时窗


界面

一条能收纳的工具带

平时是一条贴在屏幕底边的胶囊工具带;上带跟着当前工具长出"设置条"—— 笔 = 色板 + 线型 + 粗细、图形 = 22 段、橡皮 = 大小、白板 = 板色 + 底纹、截图 = 两种截法。

工具带可以拖到任意位置、贴底自动收纳;档位有「极简 / 完整」两档(极简只留 [鼠标][白板][笔][橡皮][后撤][更多] 六格,两档顺序自动保持一致);右键可以取消 / 恢复钉住; 鼠标悬停约 0.5 秒(触摸长按 0.6 秒)浮出"名称 + 快捷键 + 说明"。

书写

  • 压感口径对齐 WPF / Windows Ink:宽度 = 档位宽 × clamp(2.0 × 压力, 0.10, 2.0) (半压 = 1.0 倍、满压 = 2.0 倍),渲染走 Direct2D 原生墨迹 ID2D1Ink(逐点半径变宽); 鼠标 / 无压感设备回退等宽。
  • 跟手:每帧先等"上一帧已经上屏"再抽消息再提交(把「Present 返回 → 屏幕变色」 从 3.5 个刷新周期压到 1.0 个);真笔书写时笔迹交给系统合成器画(湿墨), 书写期间开 GC 低延迟档,一笔期间自检断言无第 2 代回收。
  • 两种橡皮:整笔擦(碰到哪条删哪条)和面积擦(只擦碰到的一块,一笔切成两段); 面积擦的尺寸跟随手速(慢速不缩、快扫封顶 2.5 倍),"看见的框 = 擦的范围"。
  • 触摸模式(9.3.2 起):设置 → 书写 → 触摸模式,两档:
    • 手势(默认):单指写;双指上下滚画布、左右翻页;双指轻点 / 长按呼出工具轮盘;三指擦除;单指长按框选 / 点选。
    • 单指:只允许一个触点写字,完全无手势(不长按选择、不呼盘、不三指擦);工具栏橡皮照常可用。
    • 面积/手掌擦(大面积触点触发的橡皮)已取消:大触点不会再把笔迹变成橡皮;擦除用工具栏的整笔/像素橡皮。多人同时书写尚未开放。

三种笔:笔 / 荧光笔 / 激光笔(9.2.1)

  • 课堂只需要三种“说话方式”:笔写推导、荧光笔划重点、激光笔指到哪里讲到哪里。
  • 按 Ctrl+P / I / L 直接切,或按住 Ctrl+Alt+Shift+Q 划向扇区,松手切换。
  • 激光笔:干净的红边 + 白芯,没有外围光晕;白板、PPT 和深色背景上都看得清。
  • 按住写时整条保留;松手后停 2 秒再整体淡出 0.6 秒;抬手再写,多条可以同时存在。
  • 粗细 2–24 逻辑像素,滑条对轨迹真的生效;它不是笔迹,不进文档、不进撤销、不会被橡皮擦掉。
  • 9.2.1 修掉了最后一条淡出后偶尔留在屏幕上的残影。

笔、荧光笔、激光笔三种笔

选中与编辑

点选(点墨迹直接选中,Shift 加选 / Alt 减选)、矩形框选(碰到就选)、套索 (代表点 80% 在圈里)。选中框 = 8 个手柄 + 旋转柄:旋转有 90° 软吸附(Shift 15° 硬网格、 Alt 自由);小对象自动改用"最小操作框",手柄不压住内容、缩放锚点钉在对象自己的对角。

对象吸附(9.2.0,9.2.2 补轴线,9.2.3 补曲线拼缝):单选图形或图片整体拖动时, 选中框的左/中/右与目标框左/中/右自动对齐,横向同理;软相交 24px,进入 5px / 离开 8px, Alt 临时关闭。9.2.2 起直线 / 箭头 / 数轴这类轴目标只认中心线,正弦对 X 轴不会再被 笔迹上/下沿先吸走;9.2.3 起两条正弦 / 余弦 / 波浪线之间按曲线中心线端点拼接,不再差一个 笔宽。目标侧不显示框,只有被拖对象出现淡橙色中心十字;圆的永久圆心改成细墨点。

操作条十格:收起 / 颜色 / 锁定 / 层级 / 导出 / 图库 / 复制 / 左右翻转 / 上下翻转 / 删除。 9.2.4 起“复制”= 原件原位保留、副本错位 24px 并选中、同时写入剪贴板;Backspace 与 Delete 同义。 颜色面板里有连续粗细滑条(拖动实时显示数值、松手一步撤销)、三档线型、4×4 色板 + HSV 取色。 复制支持"拖出副本"模式;拖动 / 旋转期间模型一个字不改,内容层一帧不重画 (预览画在浮动层,松手才提交,一步撤销)。

选中框、操作条与颜色面板

截图 · 导出 · 剪贴板

  • 截图:按下即冻结整屏 → 拖框取景(遮罩挖洞 + 准线 + 尺寸读数)→ 松开进调整 (8 手柄 / 方向键微调)→ 原位落 + 自动选中 + 进剪贴板。两种截法: 「连批注一起」和「隐藏窗口截图」(拍到的只有下层内容)。
  • 导出:选中的对象导成透明 PNG / 白底 PNG / JPEG / BMP;「更多 → 保存图片」 把整块板书存成图片。
  • 剪贴板对象通道:Ctrl+C 在同一次剪贴板会话里同时放对象字节和一张透明 PNG—— 粘回批注里仍是可编辑对象,粘到 Word / PPT / 微信里是一张图。

截图调整:8 手柄、尺寸读数与完成/取消

图片 · PDF 批注(2026-10 新)

「更多 → 墨迹 → 打开文档…」:图片可多选(一次铺一叠页)、PDF 一次一份。

  • 一图一页、一页 PDF 一页,纵向铺成一叠:滚轮细滚、PageUp/PageDown 按页翻、 页缝一目了然;批注照旧写在页面上(工具、橡皮、撤销全部照旧)。
  • PDF 页宽 = 屏幕物理宽(fit width,A4 试卷 / 课本看得清); 图片按"这台电脑上能看清"降采样,最多放大 2×。
  • 超长图自动切片:比两屏还高的长截图按"一屏一片"切成多页,原样清晰、翻页连读, 不会压成"一根针"。
  • 页位图是独立的"文档页层",不是笔迹:不写进 .inkb、不进回放 / 导出、不占撤销栈; 只留视口附近的几页(后台线程渲染,滚动不卡),内存不随页数涨—— 实测一份 122MB / 663 页的 PDF 1.5 秒内首页上屏,后台渲一页时主线程一拍只花 0.2ms。
  • PDF 渲染用 PDFium(Chrome 的 PDF 引擎,BSD-3)。随包带 pdfium.dll 与它的 许可文本(pdfium-licenses\);少了 dll 时 PDF 会提示缺库,其它功能不受影响。

有意留在下一步的:按页独立撤销 / 清空、重开文档自动读回批注、带批注导出 PDF、 密码 PDF、拖拽导入、裁剪白边、缩略图导航。

白板 · 课堂工具

  • 白板:一层遮罩(白 / 绿 / 黑三色 + 方格 / 横线底纹);切回 PPT 时板书还在。
  • 计时器 / 随机点名:两个独立居中窗,和工具带同一套视觉语言, 深浅两套主题都有。计时器三种模式各自独立计时(切页签不打断、到点响),可缩成 320×150 的小挂钟,也能真全屏;到点时数字和进度环一起变红,投影上远处一眼就看见。 秒表主显示始终是总时间,跑着时按「计次」只记分段、不打断计时;暂停后自动出 本段 / 累计 / 平均 / 最快 / 最慢统计,继续后保留记录,重置才清空。 点名抽过不重复(抽完自动重置),名单写在 %APPDATA%\InkTeach\Names.txt, 没名单时可以直接抽学号 1–N。

「更多」面板:课堂与墨迹功能入口

课堂计时器:环形进度、主按钮带文字    随机点名:抽中的人是一枚枚名牌

改时长:时/分/秒 三列步进    最小化:320×150 小挂钟    深色主题的点名窗

课堂窗的进度环跟着你当前的笔色走——笔是红的就是红环,换支蓝笔就变蓝环。 唯一的安全阀:笔色和面板底对比度不足 3:1 时(比如白笔配浅色面板)自动退回强调色, 免得"看不见时间"。


为什么是 Direct2D + .NET 10

常被问的一句:"批注软件用 D2D,是不是大炮打蚊子?" 不是。我们不是为了画动画选它,是因为有三件事只有它这一条路能做,而且都不是渲染特效。

为什么是 D2D / DirectComposition

① 笔迹交给系统合成器画,CPU 只送点。 有压感时走 D2D 原生墨迹 ID2D1Ink(逐点半径变宽);真笔书写那一段的"湿墨"直接 委托 Windows 的 Inking 引擎(DwmInk 轨迹)去画,不是我们模拟出来的。 这一条的意义不是"我们延迟更低"——延迟谁都能吹——而是湿墨这种效果不需要我们去追: 它是系统给的,我们只负责把点按时送到。

② 三层共用一条管线,各自按脏区增量出帧。 板书内容层、覆盖层界面、PPT 联动控件条是三个独立的合成目标。内容层在画布空间分块 (CanvasTiles)+ 脏矩形增量修补——落笔只重画那一小块;拖动一万条选中的内容时, 内容层一帧重画 0 块,预览画在浮动层,松手才落模型。

③ 界面全部自绘,没有一个第三方 UI 控件。 圆角、投影、悬停、色带、分段、名牌全是我们的几何。好处很具体: 深色主题、200% DPI、投影仪偏色,都是改 src/InkUi/Tokens.cs 一个文件的事—— 不用和某个框架的主题系统打架,也不用迁就它的行为。

代价也说实话:自绘没有设计器,靠"单点收口 + 离屏出图"代替—— --panelshow 能把任意一格、任意一页面板离屏渲染成图当设计稿看。

渲染管线的底层细节(2026-10 这一版补的)

这一版没有加新功能,专门把"脏区 / 相机 / 分块缓存"这几条底层路径对着几个成熟上游 逐条过了一遍——Xournal++ 的分块与预取、Rnote 的视口余量、MyPaint 的 tile 分区纪律、 Excalidraw 的相机处理、Windows Terminal 的后缓冲不变量。能直接对齐上游稳定做法的, 就直接对齐,不重新发明:

细节 做法
画布空间分块缓存 内容层按 256 像素一块烘进缓存(块原点对齐画布像素,拼接无缝);预算内常驻,超预算按 LRU 淘汰
脏矩形 + 部分上屏 每帧只提交最少的脏矩形(Present1);滚动条这类常驻元素的脏区按可见性门控——不可见就不进脏区,否则"滚动条 ∪ 笔迹"的并集会把别的列扫出屏幕
双缓冲一致性 相机变化(滚动 / 缩放)之后连续两帧整屏重铺,保证两个后缓冲都是新相机——借的是 Windows Terminal 那条"后缓冲不变量"纪律
视口外预取 视口外一圈的分块在空闲帧提前烘好(每帧限量、有预算,--noprefetch 可关)——滚到新区域没有"补课"卡顿(Xournal++ 预载 / Rnote 视口余量)
相机取整 相机平移按设备像素取整:静态内容在原位重画,不会再因为亚像素抖动"糊一下"
拖动零重画 拖动 / 旋转一万条选中内容时,内容层 0 块/帧重画:预览画在浮动层,松手才提交(一步撤销)
撤销保序 "清空"的撤销是按原位置插回每条墨迹,撤销后文档与清空前逐字节一致,不靠"追加"

每一条都在自检里挂着开关和量化数字(--prefetchtest / --scrollflash / --longrun …), 不是"感觉快了"。

为什么是 .NET 10(而不是 C++ / WPF / WinUI3)

理由 具体是什么
教室机能装 自包含发布,绿色版解压即用:不弹 UAC、不装 .NET、拷 U 盘就能用(v8.9.0 起默认 NativeAOT:单 exe 约 11MB、zip 不到 5MB)。学校机器往往锁着安装权限,装不上等于用不了
不背 UI 框架 我们要的是"一块透明覆盖层 + 逐帧增量出帧",WPF/WinUI 的合成与主题行为在这里全是负担(WinUI 的 Mica/亚克力在投影仪上掉帧,我们明确不做毛玻璃)
AOT 已经跑通并成为默认 "自绘 UI + P/Invoke + Vortice"恰好是少数能走 Native AOT 的 Windows 桌面栈之一——WPF / WinForms / WinUI3 官方就不支持 trimming / AOT。v8.9.0 起默认发 AOT:冷启动 747→642ms、绿色包从 74MB 目录缩到 11.1MB 单 exe(JIT 自包含版用 publish.ps1 -Jit 保留)
GC 我们自己管 书写期间切 SustainedLowLatency,自检断言一笔全程不发生第 2 代回收——这是靠"能控制 GC 模式"换来的

已知短板(不想吹过头):

  • Native AOT:已上并成为默认(v8.9.0。PptLink 的 dynamic 已重写为裸 vtable + IDispatch;Vortice 3.8.3 本身已标注 AOT 兼容)。JIT 自包含版用 -Jit 保留;
  • .NET 10 升级:已完成(.NET 8 的安全更新 2026-11-10 到期;v8.9.0 起是 .NET 10,支持到 2028-11);
  • 内存不便宜:空载提交 92.6MB(AOT 版 88.4MB;一万笔约 388MB),其中 .NET 运行时 + 程序集约 28MB(AOT 约 12MB)、D3D/D2D 设备与交换链约 42MB、其余是我们的代码和数据。

实测数字(本机 2 倍屏 / Iris Xe,测试方法与环境见文末文档)

项目 数字
Present 返回 → 屏幕变色 1.0 个刷新周期(未配速时 3.5)
拖动一万条选中的内容 内容层 0 块/帧重画;每帧记录平均 2.7ms / 最长 5.5ms
空闲帧 0(界面"有东西动才画")
面板 / 动画帧 约 0.5 ~ 1.5 ms
冷启动(窗口可见) 267 ms(同机空白 WPF 窗 402 ms)
一万笔整层重铺 约 190 ms(压力基准)
书写期间 GC SustainedLowLatency,一笔全程保持,自检断言无第 2 代回收
内存(空载 / 一万笔) 提交 93 MB / 392 MB

轻量:Windows 10 / 11,免装 .NET

  • Native AOT 单 exe,约 11MB;9.4.0 安装包 8.59MB、绿色包 9.57MB。
  • 不用装 .NET、不弹 UAC、不需要管理员权限;绿色版解压即用。
  • 针对 4GB 教室机,PDF 只缓存视口附近的页,翻页时后台渲染,不把内存越堆越高。
  • 底层是 Direct2D 自绘 + Native AOT;老师不用关心,能感知到的是工具栏跟手、笔迹顺滑、安装包小。

下载与安装

  1. 安装包(推荐):InkTeach-Setup-<版本>.exe —— 双击 → 下一步 → 完事。 不弹 UAC:装到 %LOCALAPPDATA%\Programs\InkTeach(只给当前用户), 自动更新因此才能无感换壳。批量部署可静默安装:
    .\InkTeach-Setup-<版本>.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART
    
  2. 绿色版:解压 InkTeach-<版本>-win-x64.zip,双击 InkTeach.exe。 ⚠ 解压出来的目录里两个文件都要在:InkTeach.exe + pdfium.dll(PDF 渲染库; 少了它「打开文档」里的 PDF 会提示缺库,其它功能不受影响)。 拷给别人时只拷软件目录,不要把开发机的 %APPDATA%\InkTeach 一起带过去。

系统要求:Windows 10 / 11,64 位。不需要安装 .NET(运行时随包发布)。 PPT 联动需要机器上装有 PowerPoint 或 WPS;没装也能正常批注,只是不联动。

开机自动启动(可选,默认关):在「更多 → 设置 → 外观 → 开机自动启动」打开。 只登记当前用户的 HKCU\Software\Microsoft\Windows\CurrentVersion\Run,不弹 UAC、不需要管理员。 登录后在后台待命:保持穿透、工具条收成小球;点小球展开工具条,或再双击一次 exe 直接进入画笔; 不会自动展开上次的板书。卸载时会清掉这条登记,任务管理器里禁用过也会按“关”显示。 绿色版移动目录后,先手动启动一次,登记里的路径会自动改成新位置。

数据默认只存本机:设置在 %APPDATA%\InkTeach,自动存档在 %LOCALAPPDATA%\InkTeach, 点名名单是 %APPDATA%\InkTeach\Names.txt。更新检查在启动 8 秒后静默做一次,之后每 6 小时一次 (只读取更新清单,不上传任何内容);发现新版本时,收起态的球 / 展开态的「更多」上会出现小红点, 也可以随时在「更多 → 检查更新」手动检查。下载包先校验 sha256 再换壳安装,对不上直接拒绝。

设备与性能统计:为统计安装量、定位卡顿和兼容性问题,软件会按天上传匿名设备卡——安装 ID、版本、 首次/最近使用日期、系统/硬件型号、屏幕/DPI、帧率/慢帧/内存、触摸点数与面积统计;不含姓名、账号、 课件、作业或屏幕内容。9.3.2 起已改为首次弹窗明确同意后才上传,拒绝不影响使用,之后可在 「设置 → 书写 → 设备与性能统计」随时关闭;关闭会停止上传并尝试删除该安装 ID 的旧设备卡。 详见 PRIVACY.md。

快捷键(摘要)

作用域 键
全局(任何程序在前台) Ctrl+Alt+Shift+T 穿透(9.3.2 起再按一次回到画笔) | Ctrl+Alt+Shift+X 退出 | Ctrl+Alt+Shift+Q 呼出盘(按住划向扇区;穿透中也能用,选扇区即退出穿透)
批注内(默认键盘归批注层) Ctrl+P 笔 | Ctrl+I 荧光笔 | Ctrl+L 激光笔 | Ctrl+E 橡皮 | Ctrl+M 选中 | Ctrl+Shift+A 截图
编辑 Ctrl+Z / Y(重做也有 Ctrl+Shift+Z)撤销 / 重做 | Ctrl+A 全选 | Ctrl+C / V 复制 / 粘贴 | Delete / Backspace 删除 | Esc 取消 | 方向键微调(Shift ×10;没选中时 ←→ 翻屏、↑↓ 滚画布)| Ctrl+= / Ctrl+- 放大 / 缩小选中(连按合并成一步撤销)
其他 Ctrl+6 换粗细 | Ctrl+B 开 / 关白板 | Ctrl+Shift+C 清空当前页 | PageUp / PageDown 翻屏(白板 / PPT / 文档;PPT 也支持 ← / →)

同一个工具键再按一次 = 只有笔 / 荧光笔换颜色;橡皮(整笔 / 面积)、框选(矩形 / 套索)的子类型在面板上带里选。 放映 PPT/WPS 时工具键会自动临时升级成全局热键,翻页用 ←→、滚画布用 ↑↓(滚轮保留"页内滚动")。 连续微调 / 缩放会合并成一步撤销(停手或做别的事才封口)。 完整键表、修改记录与冲突实测见 快捷键总表.md。

从源码构建与自检

# 交互模式(需要 .NET 10 SDK)
dotnet run --project src/InkTeach -c Release

# 键位自检(含"文档与键位表是否一致")
dotnet run --project src/InkTeach -c Release -- --keytest

# 渲染验证 + 一万笔压力基准
dotnet run --project src/InkTeach -c Release -- --selftest 8

# 功能套件(逐条红绿)与性能套件(只看数字)
pwsh -File tools/bench/Run-FuncSuite.ps1
pwsh -File tools/bench/Run-PerfSuite.ps1

这套自检不靠肉眼:合成输入 + 截屏数像素,覆盖输入链路、橡皮、选中、截图、PPT、 计时点名、导出、自动更新等 60+ 个开关;每个数字都有断言,FAIL 时退出码为 1。 完整清单见 开发笔记.md 的「自动化测试」一节。

架构

InkTeach   宿主:命令行 / 自检 / 基准(发布版双击 InkTeach.exe)
  ├ InkUi      产品界面:球 ↔ 工具带、中央「更多」面板、课堂窗(全自绘)
  └ InkEngine  引擎:文档模型 · 输入 · 渲染 · 命中 · 存档 · Win32
               唯一契约:IOverlayUi · IUiHost · IEngineCommands
  • 窗口:无边框、置顶、不抢焦点、不进任务栏的透明覆盖层;穿透用命中测试豁免 (WM_NCHITTEST → HTTRANSPARENT)把鼠标还给下层。
  • 输入:WM_POINTER 统一处理笔 / 触摸 / 鼠标;真笔的"湿墨"委托给系统合成器; 触摸有"第二根手指不许抢走正在写的那一笔"守卫;手势 / 单指两种触摸模式见上文。
  • 命中:均匀网格空间索引,从 O(笔画数) 降到 O(邻近格子)(实测快 32 倍)。
  • 引擎 / 界面分离:界面只认 IOverlayUi / IUiHost / IEngineCommands 三个契约, 整个换掉界面不影响引擎(现在挂的是 src/InkUi)。

文档

文档 内容
快捷键总表.md 快捷键唯一权威来源:每一条绑定、作用域、修改记录、注册冲突实测
开发笔记.md 踩坑记录、实测数据、自检清单、发布与自动更新细节
宣传-抖音公众号操作单.md 短视频分镜、公众号结构、录制/发布/合规清单
架构-分层与规则.md 分层、单源纪律、自检规矩
引擎边界-多界面接入规范.md 引擎 / 界面三个契约的边界
底层设计-笔迹对象模型.md 笔迹 / 图形 / 图像对象模型
对标-微软墨迹栈与我们的架构.md 与 WPF / UWP Ink 的能力对照
延时-实测与优化.md 端到端延时的分场景实测与优化依据
性能-内存与卡顿实测.md 内存口径与卡顿归因
调研-启动内存与WPF对比.md 启动内存基线、Native AOT 评估
计划-图形工具.md 22 种图形与停顿成型的规格
调研-选中工具.md 选中框 / 手柄 / 操作条的设计与同行对照
调研-截图模式-优化.md 截图模式的交互与实现
清单-软件完善.md 已知缺口与优先级盘点

许可

Copyright (C) 2026 XueRenYi0。本项目采用 GPL-3.0(见 LICENSE): 可自由使用、修改、分发(包括商用),衍生项目需按 GPL-3.0 开源并保留出处与许可声明。 需要闭源商用 / 嵌入自有产品的,可联系作者谈商业授权(版权归作者一人所有,具备双许可条件)。

参考过思路但未复制代码的项目(Ink Canvas / Inkeys / perfect-freehand / $P 等)的出处与许可, 见 src/InkEngine/THIRD-PARTY-NOTICES.md。

项目介绍

InkTeach 课堂批注工具 · 国内镜像(源码同步自 GitHub XueRenYi0/InkTeach)

定制我的领域