リフレッシュレートを変えてしまい外部スクリーンが見えなくなった際の対処（Mac）

(2020.05.13初稿)


# 使用環境

- Mac mini
- Mac OS Mojave(10.14.6)
- スクリーン:プリンストン製 HTBNE-24W

# 問題発生

スクリーンの解像度などの設定を変えようと、「システム環境設定」から「ディスプレイ」を開き、もともと60ヘルツ（Hz）のリフレッシュレートを24Hzに変更してしまった。
（リフレッシュレートの意味も知らなかったための愚行、、、）

すると、画面が一度消えてから、ディスプレイ側からの出力で「範囲外」という画面が出てきてしまいMacからの出力を見ることができない状態に。

当然だが、ディスプレイが映っていないだけなので、キーボード、マウス等からの操作は可能である。

まず、最初の解決策としては

https://macluck.net/?p=3389

こちらにあるように、対応していないリフレッシュレートに変更してしまった直後、何も操作しないまま15秒ほど待つと自動的にリフレッシュレートが戻る、というもの。

ただサイト内の情報が最新ではないため、最新のOSで解決できるかは未検証。

加えて、今このページを見てくださっている方はそのタイミングを逃してしまった方だと思うので（もちろん僕も）、それ以外の解決策を考える。

また、ネットを調べて様々情報が出てくる中、少なくとも僕と同じ環境ではどれがうまくいかないのか、という情報も有益だと思うので、失敗した方法についても説明する。

以下の方法は、見れなくなってしまったモニター（以下では"元モニター"と呼ぶ）と別に、奇跡的に自分の持っていたHDMI接続が可能なプロジェクター（以下では"替モニター"と呼ぶ）に接続して画面を見ながら操作を行った。

そのため、替のモニター、あるいは出力できる機器（AirDisplay対応機器など？）が無いと厳しいかもしれない。

<!--

#解決策１？（古典的な方法）

僕が最初に行った方法。

まず、替モニターに接続し画面が見える状態で、「システム環境設定」から「ディスプレイ」を開く。

そしてリフレクションレートの設定の選択部分にマウスカーソルを当てておき、HDMI端子を元モニターに接続する。

![スクリーンショット 2020-05-13 11.29.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571503/6c5873f1-0d98-bfbc-defe-0aa891b6b9ef.png)

そして、真っ暗のモニターの中で上のような画面が映っているはずなので、あたかも画面が見えているかのごとく、そのままクリックを行う。

この選択はキーボードの方向キーとエンターキーで操作が可能なので、一番下の60ヘルツを方向キーで選択して、エンターキーで決定。

これで元どおり！

に僕はならなかった。
２つのモニターで縦横比が違ったりして、マウスカーソルの位置などがずれてしまったのだろうか？

まあ1000人に1人くらいこれで治るかもしれないのでメモしておきます。

ちなみに僕は1人でこのお馬鹿な作業をやっていると虚しい気持ちになりました。
-->

# 解決策？（NVRAMのリセット等）

一度変えてしまったモニターごとの設定は当然ながらMac側に保存されてしまっているので、これを削除してしまえばいいのでは無いかという方法。

まず元モニターにつないでシステムを終了する。
画面が見えないが、`control + eject (ノートでは 電源ボタン)`を押すと以下のポップが出てきているはずなので、続けて`Enter`を押せばシステムを終了できる。

![スクリーンショット 2020-05-13 12.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571503/0c64e420-138c-9572-d8c0-50992b3f225b.png)

続けて再度起動する際に、困った時のNVRAM(またはPRAM)のリセット(方法は以下)

https://support.apple.com/ja-jp/HT204063

とセーフモードでの起動（方法は以下）

https://support.apple.com/ja-jp/HT201262

を行った。

するとセーフモードで起動すると（数十秒から数分？かかるが根気よく続ける）、なんとモニターが表示される！

ただ、これはセーフモード（右上に赤字でセーフブートと表示されているはず）で起動していることによる一時的なものであるので、さらに環境設定からリフレッシュレートを設定し直す必要がある。

僕が調べた中では一番多く出てくるのがこの方法で、このあとパスワードを入力してログインを行い、「システム環境設定」から「ディスプレイ」を開き元のリフレッシュレートに戻す、という手順になっている。

のだが、僕の場合ログインを行った瞬間にまた元の「範囲外」の画面が出てきてしまいモニターが表示されなくなってしまう。

そのため、これでもダメだった。

また、モニターごとの設定が保存されているという

`/Library/Preferences/mac.apple.windowserver.plist`

を削除するという方法も行ったが、これも効果はなかった。

<!--
# 解決策２？（DisplayConfigX）

http://www.3dexpress.de/displayconfigx/index_ja.html

でダウンロードが可能なDidplayConfigXというGUIのアプリを使えば、好みの解像度、リフレクションレートを選択し、再起動後にその設定を反映することができる。

**再起動後**というのが肝で、これなら替モニターで設定を行ってからシステムを終了し、元モニターに接続し直してからMacを起動すればうまくいくんじゃないかと考えた。

が、しかし、ダウンロードを行いアプリを起動しようとすると以下のポップが出てしまい開くことができなかった。

![スクリーンショット 2020-05-13 12.21.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571503/7f0e9e7e-f7b8-bc9e-aa61-6a0e5e96ef75.png)

PCに詳しい人だったらどうにかして実行できるのかもしれないけど、僕は分からぬのでこの方法も諦めた。

-->

# 成功した解決策（cscreenを使用）

「Mac リフレッシュレート 変更」
などで検索していても、設定を間違えて画面が見れなくなった僕のような愚か者用の情報はあまり多くない。

そのため、コマンドライン上でリフレッシュレートを変更できれば、替モニターでターミナル等を開いておき、元モニターにつなぎ直してコマンドを実行すれば元に戻せるのでは、という発想で調べ直すと、実際に以下の参考になるページが見つかった。

[画面共有を使用していて、物理画面が接続されていないときに解像度を変更するにはどうすればよいですか？](https://qastack.jp/apple/73177/how-to-change-resolution-when-using-screen-sharing-and-no-physical-screen-is-connected)

なお、もともと英語のページが自動で翻訳されており、あまりよろしくない日本語で書いてあるので、英語が壊滅的に苦手ではない人は英語に表示を戻すのをオススメする。
ここで分かった方法を以下で説明する。

## cscreen 

Macではコマンドライン上で解像度やリフレッシュレートの設定を確認・変更を行える`cscreen`が用意されている。

これはHomebrewを使って簡単に導入できるので、替モニターにつないでコマンドライン上で、

```
$ brew cast install cscreen
```

を実行しcscreenのインストールを行う。
成功したら、

```
$ cscreen -v
```

を実行することで今接続されているモニターの、設定可能な解像度やリフレッシュレートの情報が一覧で表示される。

```
  $ cscreen -v
DisplayID  Index     Depth     Width     Height  Refresh
27c00902       1        32      1920       1080    60
27c00902       2        32      1920       1080    60
27c00902       3        32      1280        720    60
27c00902       4        32       720        480    60
27c00902       5        32       640        480    60
27c00902       6        32      1920       1080    50
27c00902       7        32       720        576    50
27c00902       8        32      1280        720    50
27c00902       9        32      1920       1080    50
27c00902      10        32      1920       1080    24
27c00902      11        32       800        600    60
27c00902      12        32      1024        768    60
27c00902      13        32      1024        576    60
27c00902      14        32      1280        960    60
27c00902      15        32      1344       1008    60
27c00902      16        32      1344        756    60
27c00902      17        32      1600        900    60
use -h to display all usage options
```

cscreenコマンドを使えばこの中の解像度やリフレッシュレートを指定して設定を変更できる。

使い方は、コマンドライン上で、

```
$ cscreen -d <彩度> -x <width> -y <height> -r <リフレッシュレート>
```

を実行することで、希望のリフレッシュレート等を指定し変更できる。

ただ、問題は上の図のような設定可能な解像度やリフレッシュレートの情報は、見れなくなってしまっている元モニターでは確認できない。

そのため、自分の使っているモニターの型番等を調べ、ネットでオンラインマニュアル・仕様書等を見つけて、設定可能な解像度やリフレッシュレートの情報を確認しよう。

確認ができたら、僕の場合は最高解像度が1920x1080、リフレッシュレートは60Hzだったので、替モニターでターミナルを開いてから元モニターに接続し、見えない画面の中で以下のように入力し実行した。

```
  $ cscreen -d 32 -x 1920 -y 1080 -r 60
```

すると、一瞬の暗転の後、画面が元どおり映った！！
歓喜の瞬間、声を出してこの奇跡を喜びました。

特にcscreenの導入に障壁もないので、替のモニターさえあれば、大体のMacユーザーはこの方法で解決できるんじゃないかと思います。

注意点として、

※ 参考にしたサイトでは、
`$ cscreen -i <screenID> 〜〜`
のようにモニターのIDも指定していましたが、これは画面が映らない限り確認できない情報であり、僕は入力しなくても実行できました。

※ 彩度については、大抵の最近のスクリーンであれば`-d 32`で指定しておけば問題ないはずです。


#### 終わりに

いつもはqiitaは自分の作業メモ用に非公開で使用しているのですが、自分が何時間も無駄にしてなかなかに困ったので、同じトラブルにあっている人がすぐに解決できるように思わず記事にしてしまいました。

1人でもこのお粗末な記事で助かる方がいれば幸いです。