忍者ブログ

だれだよ、サスペンドと休止状態に rundll32.exe を使えるって言ったのは……

PCで、まあ、XPでもVistaでも7でもいんですが、サスペンドやらハイバーネートやらをタスクから実行したいことがあります。自動的になんらかの処理を繰り返し実行したい場合等ですな。

ここで大事なのは繰り返しという部分です。つまり、サスペンド(スタンバイ・スリープ)や、ハイバーネート(休止状態)であると、タスクマネージャからの自動的な復帰が効くわけです。

そんで、ネットでは以下のようなコマンドを実行せよ! という文章が大量に見つかります。

C:\WINDOWS\system32\rundll32.exe PowrProf.dll,SetSuspendState

電源管理にて休止状態を有効にしていると休止状態に、無効にしているとスタンバイとして動作する。

が、こんなことをするのは誤りです。SetSuspendStateの引数はBOOL型が3個であり、rundll32.exe による API 呼び出しが対応している形式(文字列型1つ)ではありません。たしかに何かしら動作してしまうのですが、ただしく API 呼び出しを行わなければいけません。そして、この誤った呼び出しをするとタスクによる自動復帰が出来ません(確実にできないかはちょっと不明ですができるという話を聞いたことがありません)。


#include 
#include 
#pragma comment(lib, "powrprof.lib")

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPTSTR, int) {
    // 1番目の引数を FALSE にするとスタンバイ、TRUE にすると休止状態
    SetSuspendState(TRUE, FALSE, FALSE);
    return 0;
}

という簡単なコードで実行ファイルを作成しましょう。3番目の引数は FALSE でないと復帰できないので注意が必要です。

復帰後については SetThreadExecutionState を叩いてあげて、アクティブであることを伝えてあげると再度スリープ状態に陥ってしまうの(ちょっと気の利きすぎた仕様)を回避することができるでしょう。

PR

2011/02/20 Note Trackback(0) Comment(0)

COMMENT

COMMENT FORM

NAME
MAIL
WEB
TITLE
COMMENT
PASSWORD

TRACKBACK

TRACKBACK URL :
カテゴリー
 
 
 
最新記事
 
(06/15)
(03/28)
(05/31)
(03/21)
(03/19)
 
 
ブログ内検索
 
 
 
カレンダー
 
06 2020/07 08
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
 
 
アーカイブ
 
 
 
最新TB
 
 
 
最新CM
 
 
 
リンク
 
 
 
Feed
 
 
 
注意点
 

英字のみのコメントは拒否しています。スパムの排除のためご理解をお願いいたします。(でも結構スルーされてしまいます。たまに掃除していますがご容赦のほどを。)

 
 
カウンター
 
 
 
アクセス解析