菜单栏操控是 Keyboard Maestro 交互自动化的重要一环,但总有一些按钮等控件不在菜单栏中,例如 Office 和部分原生软件就更喜欢往工具栏(Toolbar)中塞功能;至于一大批网页套壳软件,压根就没用多少原生控件,更难操控。面对这些非标准情形,别说是写 AppleScript,就算用 Automator 完整复制键鼠操作也不一定奏效。例如:
- 使用预览工具或 PDF Expert 等阅读器时,切换高亮颜色的选项一般都藏在工具栏内部,往往要点半天才够得着;1
- 在论坛上留言时,留言编辑器非常难用、按钮密密麻麻排在一起,不方便点击(并且这些网站往往是套模板的,开发者不太可能有工夫给你设计快捷键);
- 在网站后台上传数据时,各种按钮一般也没有快捷键,让习惯了本地编辑器之电光火石的人非常难受;
- ……
好在 Keyboard Maestro 还提供了一种兜底的交互自动化方法:大量难以或不能通过其他方式够及的控件,只要它显示在屏幕上,总有办法点下去!详言之,核心模块一 Move and Click Mouse 用于点击屏幕上的特定位置,而核心模块二 Click at Found Image 则可以点击屏幕上的特定图案。单独和组合使用两个模块,几乎每一颗屏幕上的像素都能奏出自动化旋律。
点击位置:以控制预览工具的工具栏为例
第一类兜底交互自动化的核心是位置,尤其是相对位置。尽管目标不能直接触及,但只要能够在目标位置附近找到一个参照物、而参照物的位置可以确定,就能转而点击目标位置——这好比我们不能直接看到黑洞,但通过周围天体光线的扭曲,可以间接得知其位置。当然,macOS 的自动化领域中几乎没有黑洞,自动化工具可以照亮一切。
本节以原生预览工具的高亮工具栏为例。就批注而言,最重要的是颜色,而不是笔迹粗细等细枝末节,但多数 PDF 阅读器的设计者显然是工程师思维,只想着按功能分类,而不知把常用功能提到更方便触及的位置。
观察一下上图的工具栏,手动切换高亮颜色的步骤是:点击右上角的批注工具按钮,然后移到想选用的颜色上,再点击一次鼠标。把这套操作翻译成 Keyboard Maestro 的交互自动化步骤如下:
- 先把鼠标移到预览工具窗口右上方,具体位置是相对于右上角往下、往左各30个像素,以定位到展开高亮工具栏的按钮位置;
- 考虑到部分机器性能有限或显示器,先暂停 0.2 秒;
- 模拟就地点击鼠标;
- 模拟按下方向键,连按几次直到定位到所需颜色;
- 模拟按下
↩Return
键,完成高亮颜色切换。
上述流程的突破口是当前窗口右上角这一位置,因为无论预览工具的窗口如何调整大小或移动位置,目标按钮相对于窗口右上角的位置总是不变的2,只要抓住边角位置,就能点到目标按钮。再制作几个类似的 Macro,覆盖其他常用颜色,就可以告别艰难的颜色切换,一键更改高亮颜色。
当然,上例只是一个难度适中的演示,而 Move and Click Mouse 模块参数多矣,参照物可以是当前光标位置、当前屏幕或窗口的任意一角,点击时既可以点左键也可以是右键或者其他按键——只要你的鼠标按键够多——点击时还可以模拟按下 ⌘Command
或 ⌃Control
等修饰键,并且有单击、双击甚至三击等选项。诚然,仅仅罗列这些参数是空洞的3,最好的办法还是再参考更多案例,我也在本作索引部分列出涉及 Move and Click Mouse 的其他章节,用各项案例勾勒出一个模块的不同侧面。
点击图案:以控制 PDF Expert 的工具栏为例
前例中,尚有窗口边角供辅助定位,但是在另一款 PDF 阅读器 PDF Expert 中,切换颜色的主要入口隐于右键上下文菜单中,连辅助定位都不成。不少网页也很难对付,因为网页布局容易变动,相对位置定位方案同样走不通。不过,Keyboard Maestro 仍有另一种模拟点击的方式:Click at Found Image。你可以先提供一张目标区域的截图,然后 Keyboard Maestro 就会尝试在屏幕可见区域中寻找近似图案——换言之,只要屏幕上仅有一处与目标区域图案类似,那就能够精确点击!
能否成功按图索骥——字面意义上的——关键在于截取的图案本身是否恰当。如果截取的范围太小(比如只截了一颗按钮),屏幕上很可能会出现多个近似区域,导致无法瞄准;而如果截取的范围太大,则如果软件布局稍有变动,那么 Keyboard Maestro 也无法点中相应位置——这就像检索文献,关键词太短则目标过多,关键词太长则容易查不到任何内容。在截取图案时,可以多观察不同场景下的软件界面,试着缩放窗口或把窗口移动到屏幕的各个角落,以确保所截图案总是保持稳定。如果实在拿不准,可以向右拨动途中的滑块,提升识别图案的模糊程度。
除去图像部分,Click at Found Image 模块与 Move and Click Mouse 大同小异,前者的参数也多见于后者。话说回来,两个模块其实就是一个,只不过在定位方式上有差别,但 Keyboard Maestro 特意区分,我也萧规曹随。和优化预览工具类似,我也为 PDF Expert 打造了一套高亮标注工具,详细方法可参见《用 Keyboard Maestro 为 PDF Expert 打造个性化批注工具箱》,而核心的交互自动化见诸本节。
Tips:恢复鼠标状态
设计 Macro 时,一旦完成主要的建设任务,就应当开始考虑环保问题:避免自动化对日常操作产生各种形式的干扰和影响。处理文本时可能出现剪贴板污染,覆盖剪贴板中原有的数据;交互自动化中,由于模拟了鼠标移动——相当于有第二只手把你的光标拖过去——也会导致光标位置污染。与之前处理剪贴板污染的思路类似,我在 Move and Click Mouse 和 Click at Found Image 模块前后也添加了保护机制,以在动作运行后恢复鼠标的原始位置。
在准备移动鼠标前,先添加一个模块:Set Variable “变量名” to Text “%CurrentMouse%”,其中的 %CurrentMouse%
Token 表示光标当前位置的座标。移动和点击鼠标结束后,再添加一个模块:Use Variable “变量名” to Set the Mouse Location,根据之前提取的光标座标,再把光标移回去。通常情况下,在按下并释放快捷键的几分之一秒到一秒多时间里,光标就会回到原始位置,干扰轻微。
惟需注意,既然是操控光标,那么 Trigger 就不适合设置为鼠标或触控板,以免用户操作和 Keyboard Maestro 产生冲突。
小练习
在文件自动化领域,有一个很经典的工作流:每当收到 AirDrop 来的文件,就将其移到桌面,以供继续处理。但是自 macOS 14 以来,相关的文件属性被删除,旧方案基本失效。有兴趣的读者不妨从界面自动化入手,思考如何重新实现。
- 我是如此痛恨二级菜单栏或工具栏,以至于将构思分享给 Legolas,建议制作一款没有二级菜单栏的手写笔记软件。 ↩
- 严格来说也可能会变,比如外接显示器的分辨率非常低、颗粒度非常明显(而当前在售的 MacBook 分辨率均非常高),那么两个位置之间的向量就不是
(-30,30)
。经测试,在 27 英寸的2K显示屏上可能出现定位偏移,而在4K或更高规格的屏幕上则不易出错。 ↩ - 再举一例:模拟点击右键,就可以展开右键菜单,此法可用于获取当前光标所在位置的链接,在 2-2-1 节中有具体用例。 ↩