コマンドラインによる 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 件のコメント:
コメントを投稿