モダンスタンバイ対策(マウス無効)
新しいノートPCを買ったところモダンスタンバイ (S0 低電力アイドル) になっていて、従来のスタンバイ (S3) に戻すことができなかったので、従来のスタンバイに近い動作になるように対策。スタンバイ時のマウス無効とネットワーク切断。動作確認は Windows 10 home 20H2
モダンスタンバイの確認
powercfg /a
以下のスリープ状態がこのシステムで利用可能です:
スタンバイ (S0 低電力アイドル) ネットワークに接続されています
モダンスタンバイの問題点
・マウスなどによるスタンバイ解除を抑止できない
バッテリー駆動かつノートPCを閉じている場合だけは抑止する
・スタンバイ時のネットワーク接続を切れない
バッテリ消費増加、恩恵を受けるのはストア アプリのみ(デスクトップ アプリは停止)
マウスによるスタンバイ解除の抑止
タスクスケジューラで「マウス無効」と「マウス有効」のタスクを作成し 、スタンバイ時にマウスドライバを無効、復帰時に有効にする。(要devcon.exe 管理者権限)
スタンバイ開始時(Kernel-Power 506)
devcon.exe disable "HID_DEVICE_SYSTEM_MOUSE" を実行
スタンバイ終了時(Kernel-Power 507)
devcon.exe enable "HID_DEVICE_SYSTEM_MOUSE " を実行
ハードウェアIDはデバイスマネージャーの詳細か devcon.exe hwids *mouse* で調べる。
デスクトップアプリはモダンスタンバイ時に停止するが devcon.exe の実行は間に合った。パスワード入力なし(画面ロックなし)にすると停止するのが早く間に合わない。(アプリの停止は約4秒後と約1秒後、音楽を再生して確認)
Kernel-Power 506からデスクトップアプリが停止するまで1秒程度(WAVを再生して確認)
スリープをプログラムで実行する方法
マウスを使ってスリープにするとマウスの動きで直後にスリープ解除されてしまう場合があるので対策が必要。(マウス無効になるまで3秒程度)
vbsでマウス無効後に「Windows のシャットダウン」 ウィンドウを表示しスリープを選択し実行する。
プログラム例
スリープ.vbs
Set WshShell = CreateObject( "WScript.Shell" )
Set Shell = CreateObject( "Shell.Application" )
'マウス無効のタスク実行
WshShell.Run "schtasks.exe /run /tn マウス無効", 0, True
Shell.ShutdownWindows()
WScript.Sleep 200
'{UP}/{DOWN} で スリープを選択し {ENTER}
'休止の有無によらずスリープが選ばれるように(スリープは上から3番目、次が休止)
WshShell.SendKeys "{UP}{UP}{UP}{UP}{DOWN}{DOWN}"
WScript.Sleep 300
WshShell.SendKeys "{ENTER}"
スタンバイ時のネットワーク接続の切断
1.電源オプションの非表示の項目を表示するため、レジストリエディタで
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\
f15576e8-98b7-4186-b944-eafa664402d9 に
Attributes = 2 (dword) を設定する(1: 表示なし、2: 表示あり)
2.電源オプションの詳細設定で「ネットワーク接続がスタンバイ状態です」を無効にする。
GUID は powercfg /q で調べることができる。
電源設定の GUID: f15576e8-98b7-4186-b944-eafa664402d9 (ネットワーク接続がスタンバイ状態です)
その他の非表示項目もGUIDを調べて表示することができる。(/qh なら隠し項目も)
ネットワークを切断すればバッテリ消費を少し減らせて、スタンバイ中にWindows Updateが動くことも防げる。
バッテリーの使用状況を確認するには powercfg のバッテリレポートを使う、消費の原因などが知りたい場合はスリープスタディ。
powercfg /batteryreport
powercfg /sleepstudy
「マウス無効」のタスクのトリガーがスタンバイ開始時(Kernel-Power 506)だと間に合わない可能性があるので他の方法も考えた。
「ワークステーション ロック時」をトリガーにした「マウス無効→有効 」のタスクを作成する
スタンバイ時、デスクトップアプリは停止するので 「マウス無効→待ち時間→マウス有効」で待ち時間の所で停止させる。画面ロックのみの場合は待ち時間後にマウス有効になるので問題ない。
画面ロック→スタンバイ の順なのでタスクのトリガーを「ワークステーション ロック時」にすることでマウスは確実に無効にできる。
プログラム例
画面ロックから停止まで2秒程度なので待ち時間は10秒とした。
マウス無効_有効.bat
cd /d %~dp0
devcon.exe disable "HID_DEVICE_SYSTEM_MOUSE"
timeout /t 10
rem タイマーはスタンバイ時も停止しないので復帰直後にマウス有効
devcon.exe enable "HID_DEVICE_SYSTEM_MOUSE"
exit
マウス無効_有効.vbs
Set WshShell = CreateObject( "WScript.Shell" )
Set fso = CreateObject("Scripting.FileSystemObject")
'ファイルの所にカレントディレクトリを移動
WshShell.CurrentDirectory = fso.getParentFolderName(WScript.ScriptFullName)
'マウス無効
WshShell.Run "devcon.exe disable HID_DEVICE_SYSTEM_MOUSE", 0, True
WScript.Sleep 10*1000
'タイマーはスタンバイ時も停止しないので復帰直後にマウス有効
WshShell.Run "devcon.exe enable HID_DEVICE_SYSTEM_MOUSE", 0, True
「スリープをプログラムで実行する方法」用にはトリガーなしの「マウス無効」のタスクを作る。