キャッシュプラグインの影響でコメントができなくなっていた問題を修正しました。

ディスプレイの休止でアプリのWindowサイズや配置が崩れる問題への対策

Windows

この記事を読むのに必要な時間は推定で最大約6分3秒で、速読ですとその半分ぐらいです。

ディスプレイを交換したら、ディスプレイの電源を落したり、ディスプレイが省電力モードに移行して画面が消えたりすると、実行中のアプリケーションのWindowサイズが小さくなったり、配置していたデスクトップのアイコンや実行中のアプリの画面位置が変わってしまう問題に遭遇してしまった。最近のディスプレイはEUの環境関連に準拠しているから、省電力モードに移行してしまうとPC側からはディスプレイケーブルを取り外したように認識されてしまって発生しているようです。省電力のやり過ぎで不便になるのはスマートフォンでも同じだけど💦

ディスプレイのケーブルを外すか、ディスプレイの電源を落した場合には、かなり昔のWindowsから発生する問題でしたが。省電力モードからの復帰でアプリケーションのサイズや配置が崩れるなんてことは、うちの環境ではこれまで使ったことのあるディスプレイでは発生したことがありません。毎回毎回Windowのサイズを元に戻すとか画面での位置が変わったのを再度移動させていくのも手間すぎてやっかい。

要するにWindowsがディスプレイを見失うと、Windowsでサポートしている最小の必須解像度に収まるようにWindowサイズやアプリの位置を勝手に変更するお節介な機能が働いているのが原因なのですよね。確かに使用するディスプレイの表示できる範囲外にアプリケーションがあったりすると困るんだろうけど、Microsoftはもっとよく考えてほしい。だってさぁ、Windowsの実行中にディスプレイを交換するなんてケースはほとんどないだろうから余計な機能だろうに……。迷惑になる可能性があると実装前に気付かないはずがないんだが💦

(勝手に変更せずに、表示エリア外にあるアプリケーションを調整する機能としてどこかに用意するとか、接続が同一のディスプレイならば復帰時に変更をしないとか、調整を行なうかユーザーに問い合わせるような仕様で実装する感じでよかったんじゃないのかねぇ……)


Windows 10の場合は、必須となるディスプレイ解像度が1024×768なので、その範囲内に収まるように調整されてしまいます。この設定はレジストリに用意されているため、レジストリの値を変更して1024×768ではなく使っているディスプレイの解像度に変更してしまえば問題は解決するはずです。

+Rキーを押して「ファイル名を指定して実行」から「regedit」と入力してOKボタンを押してレジストリエディタを実行します。ユーザーアカウント制御のダイアログが表示されたら許可(はい)をしましょう。

レジストリエディタで開くレジストリキーは以下の通り。

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration

ここにはディスプレイの設定が納められています。Windows 10のVer.1809の場合だと、NOEDID_8086_から始まるキーがあるはずです。いつから仕様が変わったのかはわからないけれど、確かWindows 10の以前のバージョンだとSIMULATED_から始まるキーだったと思います。おそらく各PCごとに固有の値じゃないかな。OSの再インストールでも変わりそうな気がする。なので、お手軽登録用のRegファイルは作成しない方向に💦 Ver.1809では、うちの場合はこれでした。

NOEDID_8086_3E98_00000000_00020000_3101B^A1A4DB01452062B47B1DC978DE0D0355

その下に00というキーがあり、その中にPrimSurfSize.cxPrimSurfSize.cyが存在していて、それぞれ10進数で1024と768になっているはずです。これが最小解像度を指定している値なので、使用するディスプレイの解像度に合せて変更します。初期状態では16進数での指定になっているから、10進数に変更して指定しないととんでもない値になるので要注意。自分は新しいディスプレイに合わせて3840と2160に設定しました。

その2カ所だけの変更で問題が解消されたと思っていたんだけど、一部のアプリだけなぜかまだサイズと配置が崩れてしまうことがあるのを確認してしまったので、念のために追加で00の下にある00のキーでも設定を変更しておきました。まあ、ActiveSizeは関係ないはずだけどね。

ActiveSize.cxActiveSize.cy、それとDwmClipBox.rightDwmClipBox.bottom、さらにPrimSurfSize.cxPrimSurfSize.cyの6カ所です。

ちなみに省電力からの復帰でサイズと配置が崩れてしまった場合には、復帰直後に使用しているディスプレイのキー(環境により異なる)のActiveSize.cxActiveSize.cyを使用している解像度に設定すれば復帰できるっぽいです。まあ、毎回指定して直すよりも事前にWindowsの最小解像度を使っているディスプレイと同一に設定しておいたほうが楽なので事前設定を推奨。

※ディスプレイとPCとの接続がHDMIかDisplayPortの場合に起こる可能性がある問題です。

【追記】

表示スケールを125%とか150%など、等倍の100%以外にしていると、レジストリで対策をしていても起動中のアプリのWindowサイズが等倍になってしまうことがあるようなので要注意(アプリによる)。Windows 10標準のExplorerは影響を受ける感じ。

コメント