私、久し振りにキーボードを取り替えたのですが、これにはsleepボタンが付いてないんです。Windowsを休止状態にするときに以前のキーボードではsleepボタンを便利に使っていたのですが、これがないとなると、休止状態に切り替えるのに、いちいちマウスでスタートボタンからWindowsの終了へと辿らなければならない。これはsleepボタン一発で済んでいたときに比べると相当余計に時間がかかります。
で、なんとか手間を省きたいということで調べたところ、世間には以下のようなノウハウが流布しているようだったのですが…
ワンクリックで素早くパソコンを休止状態にする
コマンドラインから電源オフや休止を実行する
これ、SetSuspendStateのAPIの定義を分かった上で書いているとは思えない内容ですねえ。この呼び出し方だと、rundll32.exe内のSetSuspendState呼び出し直前の関数のローカル変数ないし待避したレジスタの中身が引数と見なされて実行されてしまうのでは。
全部inパラメータなんだし結果的に動くからいいじゃんという考え方もありうるでしょうが、しかし、(あまりありそうでないものの)rundll32.exeがバージョンアップでもしたら動かなくなる可能性が。。。また、この方法により移行した休止状態からはタイマ等のデバイスによる自動復帰がうまくいかないというトラブルも起こっているらしいのですが、これは第3引数にあたる部分のスタック上のデータがたまたまtrueになってしまっているからでは。
これの変種としてrundll32 powrprof.dll,SetSuspendState 1,0,0
などとするものもあるようですが、rundll32.exeの仕様では、引数は常に文字列として渡されるのであって、最初3つ目の引数として”1,0,0″という文字列のアドレスが渡される結果、最初3つ目の引数だけはtrueであることが保証されるだけではないでしょうか。またしたがってもちろんこれを0,0,0などとしたからといって、休止状態でなくスリープ(サスペンド)になるなどということは考えにくいところです。
で、結論的には、休止状態にできるフリーソフト(例えばこれ)か、最近のOSならshutdown.exe /hへのリンクを作るというのが正攻法と思われます。Windows XP標準のshutdown.exeには、残念ながら/hがないので、rundll32を使うという考えが出てきたのでしょうが。