解决 macOS 连接多台显示器从睡眠状态唤醒后 App 在显示器之间互换显示位置的问题
大家使用 macOS 连接多台显示器的应该也会遇到这样的问题,之前有同事也遇到过,我教了她一种比快捷的方法,因为她之前可能会通过将 App 用鼠标或触控板一个一个移动到另一个显示器,该方式真的很麻烦。
我教她的方法是通过 系统偏好设置 → 显示器 → 排列 来设置主显示器解决,但是我觉得的该方式依旧毫无技术。因此我一直想找通过命令行的方式来解决此问题,使用命令行将更快且不需要拖动鼠标。但由于工作忙碌忘记研究命令行的方法,然而最近该问题频繁出现。
作为一名极客,我决定要研究出来!通过 Google 搜索一会儿我就找到命令行的解决方法。最后我通过配置一个快捷键 Tab + D
即可快速恢复显示器排列和主屏幕到睡眠之前的状态。
说了这么多也没说两种方法是什么,不啰嗦,下面我就把这两种方法分享给你,希望能对你有所帮助。
macOS 在命令行这块真的可以甩 Windows 好几个十万八千里啊,maoOS 大部分通过界面完成的操作都可以通过命令行来解决,真的太方便、太爽了!
问题
从标题你也能看出是什么问题,但是没有遇到过的可能就看不明白了。因此我用我自己的环境遇到的问题来描述下。
环境:
- macOS Mojave 10.14.6(Mojave 最后一个版本)
- MBP 15寸 2018
- 外接三台 27 寸 4K 显示器
在系统显示器设置中我将显示器排列和菜单栏位置配置如下图所示:
白色菜单栏:把它拖到那台显示器,那台显示器就是主屏幕,主屏幕就是打开 App,App 会显示在此屏幕上。
问题就是偶尔从睡眠状态到唤醒状态,这个菜单栏就跑到另一台显示器了。而且似乎跑了三次,导致 App 在各个显示器之间位置互换了,然后显示器菜单栏配置就变成了下图这样:
解决
通过界面操作解决
这种方法就是我之前教同事的方法,它操作原理也很简单,就是拖动白色菜单栏到直到它到你想要的显示器且各屏幕上的 App 已互换位置至未唤醒电脑之前。
该方法虽然操作也简单,但是那个白色的菜单栏又短又窄,一不小心就可能会拖到的是显示器排列,因此是个细活。想象一下本来就是鼠标手,还要搞着玩意,那是多烦躁啊!
通过命令行解决(推荐)
作为程序员,肯定是想方设法的如何通过命令行来完成界面操作咯,就像我连个 Wi-Fi 都是通过命令行来完成的(想学习的,可以看我这篇文章:为什么我连个 Wi-Fi 都会使用终端来完成?)。
我利用 Google 英文搜索,一下就在 apple.stackexchange 找到了同样的问题:Change display arrangement in OS X/macOS programmatically。接着找到答案是使用一个叫 displayplacer 的命令行工具。
displayplacer
displayplacer 是 macOS 命令行实用程序,用于配置多显示器分辨率和排列。本质上是适用于 macOS 的 XRandR。
安装 displayplacer
通过 Homebrew 执行如下命令安装:
1 | brew tap jakehilborn/jakehilborn && brew install displayplacer |
配置快捷键执行命令
在 系统偏好设置–显示器–排列 里面先设置好显示器排列顺序,然后在设置好主屏幕(白色菜单栏所在显示器)。
在终端执行如下命令,获取显示器分辨率和排列配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21$ displayplacer list
Persistent screen id: 21BA3905-792F-A0C6-9727-1A79457072E8
Contextual screen id: 459130582
Type: 27 inch external screen
Resolution: 1080x1920
Hertz: 60
Color Depth: 8
Scaling:on
Origin: (0,0) - main display
Rotation: 90
Resolutions for rotation 90:
mode 0: res:1080x1920 hz:60 color_depth:4 scaling:on
mode 1: res:1080x1920 hz:60 color_depth:8 scaling:on <-- current mode
# 省略
...
Execute the command below to set your screens to the current arrangement:
# 将下面的命令保存到脚本文件,出现问题后执行该脚本即可。
# 或用 BetterTouchTool 设置一个快捷键来执行该脚本。
displayplacer "id:21BA3905-792F-A0C6-9727-1A79457072E8 res:1080x1920 hz:60 color_depth:8 scaling:on origin:(0,0) degree:90" "id:C9176E3A-21C0-EC84-DD67-8F45B5143A83 res:1920x1080 hz:60 color_depth:8 scaling:on origin:(-1920,450) degree:0" "id:1B206EA1-2E09-2D19-C74D-CB3375D33990 res:1080x1920 hz:60 color_depth:8 scaling:on origin:(1080,0) degree:270"我是通过 BetterTouchTool 配置一个快捷键来执行该命令,由于配置的是
fn + D
fn 不是很好按到,所以我又通过 Karabiner-Elements 将Tab + D
映射为fn + D
,这样按就方便很多了。
参考
解决 macOS 连接多台显示器从睡眠状态唤醒后 App 在显示器之间互换显示位置的问题