Winows 7のハイブリッドスリープをEXCELマクロやプログラムから行う方法

背景

EXCELマクロを使って、Amebaのペタを自動でつけてまわったり、楽天のポイントを自動で稼いだりするプログラムを作っていて、困ったことに出くわした。「最後に実行中のEXCELを終了して、windowsもスリープさせたい。」でも、先にスリープさせると、EXCELが終われないし、EXCELを終わらせるとマクロも終わってしまうのでスリープできない。」このジレンマを解消するためにいろいろやってみたので、そのメモを残します。


最初はEXCELマクロでスリープさせてみた

マクロに下記のように書けば、ハイブリッドスリープができました。

Sub スリープ()

CreateObject("Excel.Application").ExecuteExcel4Macro "CALL(""PowrProf.dll"",""SetSuspendState"",""JJJJ"",0,0,0)"

End Sub

最後の ,0,0,0 のところを ,1,0,0 にすると、休止状態になります。


スリープ、休止状態、ハイブリッド スリープの違いってなんだ?

マクロから実行しないで外部コマンドで実行すれば、背景に書いた問題が解決できると考えて、その方法を探してみました。そして、いくつか試してみましたが、休止状態にはなるもののスリープにはなってくれない...

ここで、スリープ、休止状態、ハイブリッド スリープの違いってなんだ?って疑問につきあたりました。
Microsoftのサイトを調べると、下記の違いがあることがわかりました。

<スリープ>
作業を再開したいときに、すばやく (通常は数秒間で) コンピューターを通常の電力状態の動作に戻すことができる省電力の状態のこと。作業していた内容と設定をメモリに保存し、電力を少量使用し続ける。

<休止状態>
開いているドキュメントとプログラムをハード ディスクに格納して、コンピューターをオフにする。

<ハイブリッドスリープ>
開いているすべてのドキュメントとプログラムをメモリとハード ディスクに保存し、作業をすぐに再開できるようにコンピューターを低電力状態にする。突然電源が落ちた場合はハード ディスクから作業を復元する。

では、この設定はどこで確認できるのだろう?

コマンドプロンプトを起動し、「powercfg /a」と打つと私のPCでは下記のように表示されました。

----------
以下のスリープ状態がこのシステムで利用可能です: スタンバイ ( S3 ) 休止状態 ハイブリッド スリープ
以下のスリープ状態はこのシステムでは利用できません:
スタンバイ (S1)
システム ファームウェアはこのスタンバイ状態をサポートしていません。
スタンバイ (S2)
システム ファームウェアはこのスタンバイ状態をサポートしていません。
----------

ハイブリッドスリープの設定になっていました。

この設定の変更は、下記の手順で変更できます。
「コントロールパネル」-「電源オプション」-どれでもいいので「プラン設定の変更」-「詳細な電源の変更」-<スリープ>-<ハイブリッドスリープを許可する>を「ON」に変更し、<OK>をクリック

ハイブリッドスリープの設定をオンにすると、メニューの右下「スリープ」のオプションに「休止状態」が表示されなくなります。しかし、外部コマンドからは「休止状態」にもできてしまうようです。






どうすればスリープにできるの?

背景に書いた問題を解決するに当たり、スリープに移行するタイミングを若干遅らせて、EXCELが終了してからスリープするようにしたいと考えた。遅延させるための処理はあとで考えるとして、とりあえず、スリープさせねばと考え、たとえば、下記のようなコマンドのバッチを作ってみた。

C:\Windows\System32\rundll32.exe Powrprof.dll,SetSuspendState Sleep

しかし、「休止状態」にしかならなかった。

そこで、自分でプログラムを作った方が簡単かと思い、たとえばVBではどうかと調べてみた。

SetSuspendState(False, False, False)

これだけでスリープできることがわかった。1つめのFalseをTrueにすると、「休止状態」になる。
あとは、起動を遅らせるだけ。外部パラメータで「ミリ秒」の値を与えて、その時間が経過してからスリープするようにした。

System.Threading.Thread.Sleep(SleepTime) 'SleepTimeに遅延ミリ秒を代入

最初から作った方が早かった。

このプログラムをexcelから呼び出すことで、EXCELの終了後にwindowsをスリープにするという課題が解決できました。

 

ダウンロード

作成したプログラムはここからダウンロードできます(deleysleep.exe)

このアプリケーションを実行するには、
..net frameworkの V4.030319 のインストールが必要です。

http://fileforum.betanews.com/detail/Microsoft-NET-Framework-v40/1016688677/6


<使い方>

delaysleep nnnnn

nnnnn=ミリ秒

・DOSコマンドです。バッチに組み込むなどして利用してください。
・エラーチェックはしていません
・遅延させないときは、delaysleep 0 と入力してください
・ミリ秒を指定しないと何も実行せずに終了します
・パラメータは最初の1つだけ読みますので、delaysleep 1000 2000 と入力しても最初の値の1000のみ読み取ります
・このプログラムを実行したことによるいかなる損害が発生しても作者は責任を負いません。どのように動くか不安のあるかたは、下記ソースを参照ください。

Sub Main()

Dim Commands As String = Microsoft.VisualBasic.Command()
Dim args As String()
Dim SleepTime As Integer

args = Commands.Split(" ")

'Console.WriteLine(Environment.CurrentDirectory)

If args(0) = "/?" Or args(0) = "?" Then
Console.WriteLine("usage:If you want to delay 20000ms after excuteing -> delaysleep 20000")
End
End If

SleepTime = Val(args(0))

If args(0) <> "" Then
Console.WriteLine("Sleep after " & SleepTime & "ms.")
System.Threading.Thread.Sleep(SleepTime)
SetSuspendState(False, False, False)
End If

End
End Sub

このプログラムを作るきっかけとなったWEB自動巡回ツール

WEB自動巡回ツール「アムストロール」 ←ここをクリック



(※注)2011年8月21日時点では、新しいスリープ機能は反映していません。すぐにほしい方は、上記サイトからメールにて連絡ください。