解决 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. 在终端执行如下命令,获取显示器分辨率和排列配置。

    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 在显示器之间互换显示位置的问题

https://ganzhixiong.com/p/a48328cf/

Author

干志雄

Posted on

2021-09-13

Updated on

2021-09-13

Licensed under

Comments