article_image

我在读书时经常上台展示,为避免泄漏个人资讯,也为给观众一个整洁的好印象,曾做了一个自动化动作:一键隐藏当前桌面文件,并顺带切换至纯色壁纸。演示完毕,还可以一键恢复。

Alt text
早年的自制小工具,一键隐藏或显示桌面

种种设置虽然细碎,但不注意的话很可能会当场社死:想象一下,当恋爱中的某君接上投影仪或大屏幕后,比他胸膛还要宽广的女朋友脸蛋跃然屏幕之上,该是何种场景。我虽无前述癖好——不管是被看的那一方还是观看的那一方——但也注意公私有别,有意识地设了“演示模式”。

当然,一如如今智能手机上的“勿扰模式”或古早功能机上的“户外模式”,“演示模式”无非只是一个名字,具体如何,端视详细设置。本文所谓的“演示模式”,并无严格定义,只是隐藏桌面、更换壁纸和调整光标大小三项功能的集合。这样的松散组合,不害臊地说,胜在便于自由增减,例如需要录制屏幕动画者,还可以一并打开录屏软件。调整光标的需求来自读者,与既有功能相得益彰,故一并收录。

Alt text
一键开启或退出“演示模式”

Keyboard Maestro Macro 下载(GitHub)

惟原本简洁的 AppleScript 脚本方案已作古,如今实现各项功能需八仙过海——尤是借助 Keyboard Maestro 引入低代码乃至无代码思路——遂也趁此机会泛泛谈及自动化的多个方面。

第一步:切换纯色壁纸

演示时——无论是录屏,还是上台演讲——最忌背景喧宾夺主,抢了演讲者的风头。文章开头谈及的女友照片,当然是最能够瞬间瓦解会场气氛的一种背景,但即便是当事人未曾留意的默认壁纸,也可能过于复杂而干扰演示。我可以以观众的身份证实,在令人昏昏欲睡的演讲中,我更乐意想象自己在 Mojave 沙漠中或酋长岩上探险。1

故演示模式的第一要务,便是将当前壁纸切换为更简单的图片。此事本身不难——既可用图形化的 Keyboard Maestro 模块,也可求诸系统自带 AppleScript 脚本——难在事后如何一键恢复壁纸,此处就要引入变量概念。既然本文主要谈 Keyboard Maestro 方案,也恕我围绕其界面陈述具体方法。没有或不愿意使用 Keyboard Maestro 的读者,可在我的 GitHub 上找到切换壁纸的代码,下面也会提及部分通用代码。

演示模式在处理壁纸时,如同在两个桶之间转移稻谷,不得不借助第三个桶——在 Keyboard Maestro 中主要是全局变量2——在进入演示模式之际,先用一段脚本提取当前壁纸的位置,存入变量,再用 Keyboard Maestro 内置壁纸模块更换壁纸。

Alt text
设置壁纸的 Keyboard Maestro 步骤

近几年的 macOS 带有一批纯色壁纸,以 macOS 13 为例,可在 /System/Library/Desktop Pictures/Solid Colors/ 中找到,算不上好看,但适合演示时拉来充足背景布。

Alt text
系统自带的纯色壁纸

第二步:隐藏桌面文件

到了隐藏桌面这一步,事情简单许多,只需一行命令:

defaults write com.apple.finder CreateDesktop -bool FALSE; killall Finder

运行后,桌面上的文件将在一闪后隐去不见,只留下干净的桌面壁纸。略有了解以上命令语法的读者可能已经看出,只需将上面的 FALSE 修改为 TRUE,旋能恢复桌面文件。

defaults write com.apple.finder CreateDesktop -bool TRUE; killall Finder

估计多数读者也有顺手往桌面上甩文件的习惯,这完全合乎人性——我在《人是一切的尺度:桌面空间隐喻的再审视》中有进一步讨论——无需羞赧,只需把握好公私之间的边界,少在人前展示乱糟糟的桌面环境便好。

第三步:调整光标大小

此需求来自读者讨论,我此前并未意识到。具言之,在演示时,很可能投影于大屏幕,或者外接数倍于笔记本电脑屏幕的显示器,此时光标往往过于细小,主持人恐怕得急得手舞足蹈,最后还是走到屏幕前面直接用手指向目标。当然,macOS 可以晃动以放大光标,但终归不如一开始就把光标拉到最大。

调整光标虽有对应的系统设置,可惜暂无不着痕迹的自动化方法——相较于纯 AppleScript 或 Shell 脚本而言——几乎只能取道 GUI Scripting,模拟点击系统设置界面。

Alt text
最终需要打开的系统设置界面

年年岁岁有今朝,过去的十几年里,国外玩家一次又一次谈及过系统设置界面自动化问题,当时也有大量借助 AppleScript 模拟点击的思路。这条路历来磕磕绊绊,几乎每次系统升级就要代码代码,而最近几版系统改动之巨,更是令网上搜到的代码全军覆没。毕竟,GUI Scripting 的基础就是 GUI(界面),界面既易,台本当改。

修改 GUI Scripting 脚本,更多是一门心手并用的手艺,要一点一点摸索您所用系统的在地情况,这也是 GPT 等大型语言模型(LLM)爱莫能助之处——除非它们学习了本文,但保质期很可能只到下一次系统升级。

详言之,利用 GUI Scripting 点击界面元素的基本语法是 操作 目标 of 上级元素 of 上级元素 of 上级元素,而难点就在于如何慢慢挖出元素之间的嵌套关系。幸运所至,您可以用简单的 get every 某某元素 of 语法逐步挖掘出目标,以 macOS 13 为例,首先尝试挖掘所有 Pane,再挖掘 Anchor,并在结果中尝试搜索目标位置可能的关键词——本例是 accessibilitypointer,不过也存在元素名称和屏幕上所示不同的情况,未来你说不定要盲猜近义词(比如 pointer 的近义词是 cursor)。

Alt text
一步一步摸索有可能的 Pane
Alt text
一步一步摸索有可能的 Anchor

确定元素后,尝试定位,效果如我所料。

Alt text
定位到调整光标大小的界面

不过,定位到目标界面还只是走到半途,最终需要确实点击下去。此事原本也有对应 AppleScript 代码,但起码在 macOS 13 之后已经无效,而前述连蒙带猜的路子也陷入死胡同。此时就要搬出 Keyboard Maestro 屡试不爽的土方子:根据图像特征,模拟点击屏幕上的任何元素3

Alt text
设置光标大小的 Keyboard Maestro 步骤

稍加观察,不难发现,尽管目标在于光标大小的滑动条,但可以先定位到附近有特点的区域,再根据滑动条与固定区域之间的相对距离,推算出需要移动的座标。可以一次一次尝试,也可以找个修图工具,截取目标区域截图后丢进去测量一下。

其他

本文方案,无非是松散的功能联盟,前面三个小节所实现的功能也互不依赖,读者若不需要其中一两项,当然可以将其禁用或剔除。若是还有其他要求,也可以考虑一并加入 Keyboard Maestro Macro,免得临场手忙脚乱。

例言之,若经常录屏并制作演示动画,则可能需要打开一堆辅助软件,录屏工具自不待言,用心的制作者可能还会准备一个快捷键可视化工具——一个很经典的是 KeyCastr——以显示当前的按键操作。甚至有人开发过鼠标点击可视化工具,不过系统自带录屏就能显示鼠标点按动画,我个人对于花哨的第三方软件并无兴趣。无论如何,都可以把这些软件一并纳入演示模式,一次性备妥,就像烹饪前宜将葱、姜、蒜、油、盐一字排开;而退出演示时,也可以同时关闭相关软件,以免打搅日常工作。

Apus 利用 Keyboard Maestro 中的开关模式,将开启和退出演示模式两个动作合而为一,再挂到 LaunchBar 下面以便取用,也属良策。


  1. Mojave 沙漠和酋长岩(El Capitán)的照片都曾是 macOS 的默认壁纸。
  2. Keyboard Maestro 中也有局部变量(local variable),在动作运行之后即会消失,不给系统增添负担。但开启演示模式与退出之间隔了相当长一段时间,不宜使用局部变量。
  3. 拙作《Keyboard Maestro 进阶指引》中的《3-3 终极兜底交互自动化:点击屏幕上几乎任何位置》一文,对模拟点击图像模块有进一步介绍。

author_avatar

Lawyer, macOS/iOS Automation Amateur