画面オフ・モダンスタンバイ・休止状態

最近、新しい PC を入手した。

新しいスリープ「モダンスタンバイ」とは!?

この Windows 10 タブレットは、シャットダウンメニューから「スリープ」を選択すると、スリープ状態に移行する。しかし、スリープ状態なのに、USB デバイスへの給電が行われっぱなしのままになっている。

この状態は、現代的なスリープの形態であり、様々な名称で呼ばれている。

  • モダン スタンバイ
  • コネクト スタンバイ
  • InstantGo
  • S0ix

この記事では「モダンスタンバイ」と呼ぶ。

画面オフAPIがなぜかモダンスタンバイを引き起こす

モダンスタンバイに移行する方法は、現段階で 4 つあることが分かっている。

  • シャットダウンメニューから「スリープ」を選択する
  • 電源の設定で、「電源ボタンを押すとスリープする」に設定している状態で、電源ボタンを押す
  • 電源の設定で、設定した「自動的にスリープになる時間」に到達する
  • 画面をオフにする Windows API SendNotifyMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2) を呼ぶ

重要なのは、4 つ目である。画面オフを PC に命令しているだけなのに、モダンスタンバイになってしまうのだ。

なんでやねーん

モダンスタンバイは、ほぼ「画面をオフにしているだけ」の状態に等しい。なので、画面をオフにしたいだけのつもりでモダンスタンバイにするのは、望み通りの挙動とも言えるが、「画面オフ」と「モダンスタンバイ」の間には、決定的な違いがある。それは、モダンスタンバイから復帰後に、ログインパスワードを求められるということだ。スリープ復帰後にログインパスワードを求められるように設定しているからこそ、こういうことには当然なるのだが、「画面オフ」API を呼ぶことによって単純に「画面オフ」になってくれさえすれば、このような「ん?」と引っかかる状況にはならない。

望むことは一つ、画面オフ API を呼んだら、モダンスタンバイにはならず、画面オフになってくれ。

画面だけオフにしたいのに……(´・ω・`)

画面オフ状態に移行する方法は、現段階で 1 つあることが分かっている。

  • 電源の設定で、設定した「自動的に画面オフになる時間」に到達する

手動で画面オフは不可能である。

モダンスタンバイ中、なぜか勝手に休止状態になる

さて、PC をモダンスタンバイ状態にしていると、一時間ほど経過して、自動で休止状態に移行してしまう。これは "Adaptive Hibernate" と呼ばれている。

させない方法がある!

"Adaptive Hibernate" を制御する方法の一つに、電源の設定には通常現れない、隠し設定を表示して設定するというものがある。

すなわち、レジストリ コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\8619B916-E004-4dd8-9B66-DAE86F806698\9FE527BE-1B70-48DA-930D-7BCF17B44990 キーの値 Attributes (REG_DWORD) を 0x2 に変更する。

regedit.exe で上記を行った後、電源の設定で電源オプションを開くと、「プレゼンス認識電源動作」という "Adaptive Hibernate" 関係のカテゴリが追加されているのが確認できる。その中の唯一の項目「スタンバイ割り当て率」で、モダンスタンバイ状態でどれだけバッテリを消費していいかの率を定められる。デフォルトでは 5% であり、モダンスタンバイ中にバッテリが 5% 消費されると、自動で休止状態に移行する。時間に換算すると、うちの環境では一時間前後だ。

やったぜ

「スタンバイ割り当て率」を 0% に変更すると、モダンスタンバイ中に自動で休止状態へ移行することが行われなくなるはずである。検証中だ。

ちなみに

ところで、スリープする Windows APISetSuspendState(FALSE, FALSE, FALSE); というコードを実行すると、モダンスタンバイにはならず、なんと休止状態に移行する。

ありがとう World Wide Web