7.04.2011

Put Windows in standby mode from command line

コマンドラインによる Windows のスタンバイ

コマンド(スクリプト)から Windows をスタンバイ状態にしたい。
しかしこれが意外と難しいようだ。

電源絡みの外部コマンドとしては「shutdown.exe」 「logoff.exe」などがあるが、スタンバイは実現できず。
行き着くところは「powrprof.dll」であるが、ネットに跳梁している「rundll32.exe powrprof.dll,SetSuspendState」
ではどうだろうか?

これは休止モードが無効であればスタンバイ状態となり要件を満たすが、
休止モードが有効だと休止モード(ハイバネーション)になってしまう。惜しい。
ちなみに、「rundll32.exe powrprof.dll,SetSuspendState 0,0,0」のようにパラメータを増やしたところで
rundll32 が正しく解釈してくれないので全く意味が無い。

「powercfg.exe」で休止モードを無効化することもできるが、スタンバイ状態にするためだけに
グローバルな設定を変えてしまうのはスマートな方法とは言い難い。

結局、今のところ直接DLLを叩くくらいしか有効な手段がなさそうなのである。
VBA(VBScript は直接DLLを利用できないので不可)でも可能と思われるが、今回はC++で作ってみる。

VC++ なら、以下のようなコードである。

   1: // Put in standby mode
   2: #include <windows.h>
   3: #include <powrprof.h>
   4: #pragma comment(lib, "powrprof")
   5:  
   6: void main() {
   7:   SetSuspendState(0, 0, 0);
   8: }

gcc では、「#pragma comment」が解釈できないため、リンカーに直接DLLを指定する必要がでてくる。
Eclipse CDT ならプロジェクトの Properties から、「C/C++ Build」-「Settings」-「Tool Settings」を開き
「MinGW C++ Linker」-「Libraries」-「Libraries (-l)」に「powrprof」を追加すればよい。

参考:
http://d.hatena.ne.jp/naga_sawa/20080930/1222741442
http://msdn.microsoft.com/en-us/library/Aa373201

0 件のコメント:

コメントを投稿