实时画面卡
任务在后台运行时,屏幕角落会有一张小卡片,实时显示 DeskMind 正在操作的那个窗口,下面用文字写出它正在做的这一步。这是 Mac App 0.4.0 的新功能,默认开启。要关掉,在 View(显示)菜单里取消勾选 显示任务窗口的实时画面。这个设置从下一个任务开始生效;想暂停当前任务的画面,把卡片收起即可。
任务操作的窗口通常不在你眼前:可能压在你自己的窗口后面,也可能在另一块屏幕上。屏幕顶部的灵动岛告诉你任务在做什么,卡片让你看到那个窗口现在的样子。
卡片上有什么
Section titled “卡片上有什么”- 标题栏: 小方、应用名,以及第几步或当前状态。
- 画面: 任务窗口的完整画面,被其他应用的窗口挡住时也一样。橙点标出上一步操作的位置,点击时会荡开一圈波纹。DeskMind 从不移动你自己的鼠标指针。
- 画面下方一行: 正在做的这一步,用文字写出,比如「输入 “hello”」。
看小方的眼睛就知道现在的状态。它脚边的橙点是状态灯。
| 小方 | 状态 |
|---|---|
| 眼睛盯着橙点 | 工作中,眼睛跟着操作位置移动 |
| 抬头 | 需要你:有问题要问,或要你批准 |
| ^ ^ | 完成了 |
| – – | 没做完、被停下,或窗口看不见 |
鼠标移到卡片上,按钮才会出现。
| 操作 | 结果 |
|---|---|
| 拖动卡片 | 吸附到最近的角落,之后的任务也停在那里。 |
| 双击,或点 放大 | 画面从最大 360 × 240 点放大到最大 720 × 480 点,保持窗口比例。再来一次就缩回。 |
| 点 收起 | 卡片变成 260 × 36 的胶囊,显示状态和这一步。收起期间暂停截取画面。 |
| 点 停止任务(■) | 停止任务。 |
| 需要你时点卡片 | 打开 DeskMind 窗口,在那里回答。 |
- 从不抢键盘,也从不跑到最前面。 你在别处打的字照常进到别处。
- 避开任务窗口。 如果你选的角落会挡住那个窗口,卡片就换到下一个不挡的角落:先换到同一条边的另一头,再换到同一侧的上下另一角,最后是对角。
- 应用铺满屏幕时,点击会穿过卡片。 大多数人习惯把应用开到最大,这时四个角都会挡住窗口。卡片于是停在离任务最近几次操作最远的角落,点击直接穿过它落到应用上。把鼠标在卡片上停半秒,按钮就能用了。任务的点击落下时不会在卡片上停留,所以总能穿过去。
- 告诉你结果,然后离开。 任务结束时,卡片在最后一张画面上显示 完成了、没做完 或 已停止,停留 2.5 秒后淡出。如果你在这之前就开始了新任务,旧卡片会立刻消失。
| 情况 | 卡片怎么做 |
|---|---|
| 窗口被其他应用的窗口挡住 | 照样显示完整的窗口。截取时把其他应用的窗口排除在外。 |
| 同一个应用的另一个窗口盖在任务窗口上 | 在 0.4.0 里,这个窗口也会出现在画面中,和你屏幕上此刻看到的一样。 |
| 窗口移动、改变大小或换到另一块屏幕 | 跟着窗口走,大约每 0.5 秒检查一次。 |
| 窗口横跨两块屏幕 | 卡片显示其中一块屏幕上的那部分。 |
| 窗口被最小化、关掉,或在另一个桌面空间 | 保留最后一张画面,调暗,并显示「窗口不可见」。窗口回来,画面也回来。 |
| 同一个应用还开着别的窗口 | DeskMind 指明它操作的窗口之后,卡片只显示那个窗口,绝不切换到别的窗口。在那之前,以及只靠像素识别、拿不到窗口列表的应用,卡片显示该应用最大的窗口。 |
| 应用还没打开 | 任务开始前,DeskMind 先在后台打开它。拿到第一张画面之前,卡片显示「启动中」。 |
| 任务有问题要问,或需要你批准 | 卡片显示「需要你」,小方抬头。点卡片,在 DeskMind 里回答。 |
| 你截图或共享屏幕 | 卡片是普通窗口,所以会出现。 |
| 模型看屏幕时 | 模型永远看不到卡片。每一步的截图只截任务窗口本身。 |
| 你录制任务 | 录像里不含卡片。录制整个屏幕时会包含。 |
开着实时画面运行任务时,macOS 会在菜单栏显示屏幕录制指示。卡片用的是 DeskMind 已有的「屏幕录制」权限。
- 任务窗口。 DeskMind 指明它操作的窗口之后,卡片只显示那个窗口,从不切换到同一个应用的其他窗口,也不切换到屏幕上的其他东西。在那之前,以及只靠像素识别的应用,卡片显示该应用最大的窗口。其他应用的窗口不会进入画面。在 0.4.0 里,如果同一个应用的另一个窗口盖在任务窗口上,它会出现在画面中,和你屏幕上看到的一样。
- 画面不离开后台助手。 截取画面和绘制卡片都由持有「屏幕录制」权限的后台助手 DeskMind Hands 完成。画面不会传给 DeskMind App,不存盘,也不会离开你的 Mac。
为什么一次只拍一张
Section titled “为什么一次只拍一张”卡片大约每 0.2 秒拍一张,用的是 ScreenCaptureKit 的单张截图。它不开持续的抓取流,因为抓取流一开,模型就会变慢。
我们在一台 M4 Pro(macOS 27.2)上用固定的 MLX 负载测过:
| 模型旁边同时在跑的截取 | 每轮耗时 |
|---|---|
| 无 | 102 毫秒 |
| 抓取流,每秒 2 帧或 10 帧 | 121–125 毫秒 |
| 单张截图,每秒 10 张也一样 | 101–107 毫秒 |
在这组测试里,抓取流一开,每轮慢约 20%;在真实运行中,基于抓取流的卡片也让决策慢了约 20%。改用单张截图后,一次真实任务的对照里(第 4–9 步),关掉卡片时平均每次决策 5.35 秒,开着时 5.56 秒,慢约 4%。这些都是一台 Mac 上的小样本,测量记录见加入卡片的那个 PR。录制任务会让决策变慢,也是这个原因,见成绩与局限。
另外两个选择:
- 从整块屏幕截取,排除其他应用的窗口,再裁到任务窗口。 所以窗口被其他应用挡住时也能完整显示。如果改成在截取设置里直接指定这个窗口,macOS 26 及以后会在它上面加紫色的「正在共享」标记。
- 按卡片尺寸的两倍像素截取,但不超过窗口本身的像素。 这样在 Retina 屏上清晰,又不用每秒五次复制整个 5K 窗口。
卡片本身在 app/Helper/LiveCard.swift。不需要屏幕的那部分判断在 app/Shared/LiveView.swift:显示哪个窗口、卡片多大、放在哪个角、橙点画在哪、什么时候接收点击。这些由 app/tests/DecisionTests.swift 做单元测试。桌面测试 app/tests/e2e/live_view.sh 会在一个临时的文本编辑文档上驱动真实的卡片,全程不按任何键,也不把任何应用切到前台。