Vistaの電源管理

XPならタスクマネージャからシャットダウンできたが、
Vistaはできないので調べてみた。


マザーボードBIOSの設定はS3にしてある。
S3でないとスリープの時にファンが落ちないため。


REM 終了、電源を切る、シャットダウン
shutdown.exe -s -t 0

REM 再起動、リブート
shutdown.exe -r -f -t 0

ここまでは問題ないが、問題はスリープだ。
スリープとはデスクトップPCの場合、
メモリとディスク両方に保存され、通常はメモリから復帰するが、
電源障害などでメモリから消えた場合はディスクから復帰するというものだ。


rundll32.exe PowrProf.dll,SetSuspendState Sleep

rundll32.exe PowrProf.dll,SetSuspendState 0,1,0

という例があったが、これらを実行し電源を入れると、
BIOSから立ち上がり、ディスクから復帰しているようだ。
これではハイバネート(休止状態)だ。


仕方なくプログラムを組むことにした。


// .NETのコードだが、WinAPIのSetSuspendStateを呼び出しているだけ。
// WinAPIの場合の第1引数はFALSE。
Application.SetSuspendState(PowerState.Suspend, false, false);
PowerState.Suspendとあるが、実際の挙動はスリープそのものだ。
コンセントを抜いて放置してから立ち上げると、ディスクから復帰してくれる。


ただし、問題もある。
Vistaのメニューからスリープにした場合もそうだが、WOLが上手くいかない場合がある。

シャットダウン 成功
ハイバネート 成功
スリープでメモリから 成功
スリープでディスクから 失敗

これは設定の問題なのか、Vistaの問題なのか特定が難しいので保留。