CosmosBlueのブログ

日々のよもやま話を徒然と

長時間スリープからの復帰でウィンドウがメインモニターに集まる件(Windows11 23H2)

この記事は、Windows11マルチモニター環境にあって、概ね60分とか90分とか長いスリープから復帰した際に、それまでサブモニターにあったウィンドウが全てメインモニターにリポジションされてしまう事象に対する解決策の一つです。この事象に該当しない方には意味がないかもしれません。

2024/1/10追記:

2024年1月期の定例アップデート後に、メインモニターに置き去りにされる確率的動作が復活してしまいました。なので、本記事以下はあくまでも参考程度にご利用ください。がっくりんこ

2024/3/31追記:

3月定例アップデート後は結構な確率で置き去り事象が出ています。これまでよりも短いスリープ(10分とか20分とか)で発生することが多くなりました。

 

いわゆるDP問題ではなく(メイン・サブともHDMI接続)、BIOSもグラフィックドライバーも最新。ブランクスクリーンから指定時間後にスリープ(モダンスタンバイ)に突入し、そこから10分とか20分で復帰した場合、ウィンドウはメイン・サブとも元のままです。ところが長いスリープから復帰すると全てのウィンドウがメインモニターに再配置されてしまいます。

Windows11のディスプレイ設定で「モニターの接続に基づいてウィンドウの位置を記憶する」もチェック、「モニターが接続されていないときにウィンドウを最小化する」もチェックしていますが、位置も覚えてねぇわ、最小化すらされてねぇ。

で、この記事のメソッドがソリューションになり得るかどうかは、事象の類似性に加えて、以下で確認することができます。該当しない方は別のソリューションを探してください。スタートボタンを右クリックして「ターミナル(管理者)」を起動し、次のコマンドを入力します。

  • PS C:\Users\PC-User> powercfg -Q
  •  
  •  
  •  
  •  
  •  

上記コマンドの出力の中から以下の項目を見つけてください。

  • 電源設定の GUID: 94ac6d29-73ce-41a6-809f-6363ba21b47e (ハイブリッド スリープを許可する)
  • GUID エイリアス: HYBRIDSLEEP
  • 利用可能な設定のインデックス: 000
  • 利用可能な設定のフレンドリ名: オフ
  • 利用可能な設定のインデックス: 001
  • 利用可能な設定のフレンドリ名: オン
  • 現在の AC 電源設定のインデックス: 0x00000001
  • 現在の DC 電源設定のインデックス: 0x00000001
  •  
  •  
  •  

現在のAC/DC電源設定のインデックスが1ならこのメソッドで解決できる可能性があります。インデックスが0の場合や、この項目が存在しない場合は残念ながらこのメソッドでは解決できません。

ということから分かるように、このメソッドではインデックスが1の場合これを0にすることで、モダンスタンバイの最終フェーズ(ハイバネーションのような状態)を無効化するということになります。では早速やり方です。

まず、現在適用中の電源プランのGUIDを取得します。

  • PS C:\Users\PC-User> powercfg -L
  • 既存の電源設定 (* アクティブ)
  • -----------------------------------
  • 電源設定の GUID: 381b4222-f694-41f0-9685-ff5bb260df2e (バランス) *
  •  
  •  
  •  

GUIDをメモ帳などにコピペしておきます。続けて前述のpowercfg -Qの出力、ハイブリッドスリープの項目から少し上にサブグループ(スリープ)のGUIDがあるので、それもコピペしておきます。

  • サブグループの GUID: 238c9fa8-0aad-41ed-83f4-97be242c8f20 (スリープ)
  • GUID エイリアス: SUB_SLEEP
  • 電源設定の GUID: 29f6c1db-86da-48c5-9fdb-f2b67b1f44da (次の時間が経過後スリープする)
  • GUID エイリアス: STANDBYIDLE
  • 利用可能な設定の最小値: 0x00000000
  • 利用可能な設定の最大値: 0xffffffff
  • 利用可能な設定の増分: 0x00000001
  • 利用可能な設定の単位: 秒
  • 現在の AC 電源設定のインデックス: 0x00000708
  • 現在の DC 電源設定のインデックス: 0x000000b4
  • 電源設定の GUID: 94ac6d29-73ce-41a6-809f-6363ba21b47e (ハイブリッド スリープを許可する)
  • GUID エイリアス: HYBRIDSLEEP
  • 利用可能な設定のインデックス: 000
  • 利用可能な設定のフレンドリ名: オフ
  • 利用可能な設定のインデックス: 001
  • 利用可能な設定のフレンドリ名: オン
  • 現在の AC 電源設定のインデックス: 0x00000001
  • 現在の DC 電源設定のインデックス: 0x00000001

そして、もちろんハイブリッドスリープのGUIDもコピペしておきます。

では、コピペしたGUIDを用いてハイブリッドスリープをAC/DC共に無効化します。ハイブリッドスリープを無効化してもモダンスタンバイ(S0低電力アイドル)が出来なくなる訳ではありませんので誤解されませんように。

  • PS C:\Users\PC-User> powercfg -setDCValueIndex 381b4222-f694-41f0-9685-ff5bb260df2e 238c9fa8-0aad-41ed-83f4-97be242c8f20 94ac6d29-73ce-41a6-809f-6363ba21b47e 0
  •  
  • PS C:\Users\PC-User> powercfg -setACValueIndex 381b4222-f694-41f0-9685-ff5bb260df2e 238c9fa8-0aad-41ed-83f4-97be242c8f20 94ac6d29-73ce-41a6-809f-6363ba21b47e 0
  •  
  •  
  •  

実行エラーがなければ、再度"powercfg -Q"を出力してハイブリッドスリープの「現在のAC(DC)電源設定のインデックス」が0になっていることを確認します。

  • 電源設定の GUID: 94ac6d29-73ce-41a6-809f-6363ba21b47e (ハイブリッド スリープを許可する)
  • GUID エイリアス: HYBRIDSLEEP
  • 利用可能な設定のインデックス: 000
  • 利用可能な設定のフレンドリ名: オフ
  • 利用可能な設定のインデックス: 001
  • 利用可能な設定のフレンドリ名: オン
  • 現在の AC 電源設定のインデックス: 0x00000000
  • 現在の DC 電源設定のインデックス: 0x00000000
  •  

これでスリープ後60分でも90分でもサブモニターに元あったウィンドウが戻ってくるようになりました。スリープから復帰した際は一瞬何もないデスクトップ画面になるのですが、メインモニターのタスクバーからシュッと飛んで来るようになりました。ここまで長かった・・・

色々な手を打ってみましたが、ことごとくダメでした。特に多かったのはDP問題に帰結する記事や、グラフィックドライバーに帰結する記事でした。中にはお決まりの"これでダメならクリーンインストールしかないですね"的な記事もありました。スリープ復帰時とは言っても浅いスリープでは問題なく、深いスリープだとウィンドウが寄ってくるので、どれも何かが違うと思いながら記事の内容を試行錯誤していました。

問題はスリープが長くなると意図した動作をしないところでした。どう考えてもスリープ中に何らかフェーズが変わり、それが影響してウィンドウ配置の記憶が消散するとしか考えられません。ハイブリッドスリープは「通常はバッテリー駆動のノートPCでデフォ」という記事も自分の勘違いを助長しました。少し前にハイブリッドスリープの設定は一度見たのですが、その時は「AC電源しかない自分のNUC13はハイブリッドスリープを許可していても使われていないはず」と思い込んでしまいました。

また、"powercfg /sleepstudy"でレポートを何度出力してみても、スリープはあれどスリープ後の「休止」の記録がありません。ハイブリッドスリープが「スリープ+休止」だと思っていた自分はここでも「やっぱりハイブリッドスリープは使われてないよな」と思い込んでしまいました。更に惑わされたのは「モダンスタンバイ」と「ハイブリッドスリープ」を同一視する記事や、「ハイブリッドスリープ」と「休止状態」を同一視する記事でした。

「ハイブリッドスリープ」は一定時間スリープした場合、「休止に似た」ステートへ移行する動作を含むスリープで、powercfgではそれをするかどうかを定義している、また、ハイブリッドスリープはあくまでスリープ(の一種)であって、「休止(ハイバネーション)」ではない、だからレポートにも「休止」が付かないのだろう、という仮説を立てました。ちなみに"powercfg /H off"で「休止」を無効にしても、ハイブリッドスリープには何も影響しませんでした。

そこで、あらためてpowercfgを確認してみると、ACもDCもハイブリッドスリープが許可になっていて「ん?これってノートPCとか関係なく動作してんじゃね?」と思い始めました。要は最後のフェーズで休止(的な)状態にならなければ、サブモニターは何もかもを忘れることなく復帰できるんじゃないか?と思ったのが実験契機でした。

ただ、どうしても戻らないウィンドウがあります。サブモニターで最大化したウィンドウと、スナップレイアウトで配置したウィンドウです。これらはメインモニターに置き去りのままです。

どうも左側がサブモニターというのは良くないのかもしれません。メインモニターだけの場合はメインモニター左上隅が座標(0,0)になりますが、拡張表示でサブモニターが左側にあるとサブモニターが仮想デスクトップの座標(0,0)を持ちます。この際にメインモニターの左上隅は(FHDの場合)座標(1920,0)になります(APIではメインモニターが(0,0)で、サブモニターがマイナス座標(-1920,0)になるかも)。サブモニターが右側にある場合なら、サブモニターの状況に関係なく座標(0,0)は常にメインモニターにあります。ここら辺の位置取りとタイミングが関係しているのかなと疑っています。

モニター環境を書き忘れていたので追記しておきます

  • モニター1(メインモニター:向かって右側)
  • BenQ GW2480E
  • 解像度:1920x1080
  • リフレッシュレート:60Hz
  • 使用ポート:HDMI
  • PC側ポート:HDMI1
  • 入力自動切換:On
  • モニター2(サブモニター:向かって左側)
  • BenQ GW2283
  • 解像度:1920x1080
  • リフレッシュレート:60Hz
  • 使用ポート:HDMI1
  • PC側ポート:HDMI2
  • 入力自動切換:On

とにかく環境が千差万別なので、このメソッドでは何ら効果がなくガッカリされる方もいらっしゃると思いますが、その場合はすぐに別の解決策を探しに行く方がよろしいです。ハズレで試行錯誤しても仕方がありませんし、自分もそうやってたどり着いたので。

今回のNUC13はWindows11のISOからDVDを焼いてインストールしたネイティブ11でした。なんかデフォルトで最大限サステナブルな省電力設定になっているようです。Windows10からアップグレードした前機NUC11ではこんな設定をいじった記憶がありません。Media CreatorのDVDやUSBからWindows11をクリーンインストールした方(でマルチモニターの方)はお気をつけくださいませ。

 

※この記事は最大限の省電力を妨げる目的はありません。利便性と省電力のトレードオフはそのPCオーナー自身が自由に考えることであり何ら強制することはありません。この記事によって被ったあらゆる損害についてブログ主は免責とさせて頂きます。