2017年10月27日金曜日

スリープから復帰するとウィンドウ配置が変わる

4Kディスプレイに変えてから、パソコンをスリープから復帰させると、ウィンドウの配置が変わってしまう現象が意外にうっとおしい。
これはDisplayportという端子でディスプレイを繋いでいると起こる現象で、昔からある不具合らしいです。

原因は通電したまま機器の取り付け、取り外しを可能とする仕様(ホットプラグ)にあるそうです。ディスプレイの電源がOFFになると、接続ケーブルを抜いた時と同じ信号を送ってしまうとか。

なのでディスプレイの電源を入切しただけなのに、Windowsはディスプレイが新規に取り付けられたと勘違いして、デスクトップの初期化をしちゃいます。

初期化ではWindowsは過去に接続した時に覚えた初期設定情報を探して、見つかったらそれを参照します。この時、実際の画面の広さより初期設定情報が狭いと、ウィンドウが見えなくなったら困るだろうということで、ウィンドウ位置や大きさを自動調整する結果、ウィンドウが全部左上に寄っちゃったり。

ネットではこの初期化情報を実際の画面の広さに合わせ、自動調整しないようにするという回避方法が多く紹介されています。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration
の配下にあるエントリーのうち、画面サイズを保持しているキーの値をいじくる方法です。検索すると詳しい情報があります

試してみましたがダメでした。マルチディスプレイや4Kディスプレイだとこの方法でもうまくいかないことがあるようです。

ちなみに、うちの環境ではディスプレイを何度も交換したり、テレビを接続したりしているので、上記レジストリ配下に30個くらいエントリーがあり、どのエントリーが現在使用中の設定に対応するのかわからないので、とりあえずバックアップを取ってConfigrationキーをサブキー含めて削除しました。このキーは必要に応じて自動で再作成されますので、ディスプレイ電源入切でできたエントリーを確認したところ、ちゃんと横=3840、縦=2160になっていました。
ちなみにSIMULATED_XXXXのエントリーをいじるという情報が多いですが、Windows10ではこの設定は使われなくなったようです。

色々と試行錯誤した結果、結局レジストリの値は関係なくて、ディスプレイの接続を1台のみ(Displayportのみ)にすることで回避できました。
マルチディスプレイにしたい時だけ、ケーブルを繋がなければいけないのですが、スリープの度にウィンドウ位置が変わる方が面倒なので。

参考までに我が家のPCのディスプレイ環境。
OS:Windows10 Pro 64bit
DVI-D:三菱FullHDディスプレイ(VISEO MDT221WTF)
Displayport:JAPANNEXT 4Kディスプレイ(JN-T2820UHD)
HDMI:Pioneer5.1chサラウンドシステム(HTP-S535+S-SWR5CR)
サラウンドシステムには4KテレビREGZAが付いてます。