« [NEWS] 太陽風が水を創る | トップページ | [Windows7] 一般向けパッケージの予約販売が始まりました »

2009年9月25日 (金)

[.NET] プログラム実行中のスタンバイ回避 (Vista)

以前、 MSDN フォーラムに書いたことなんだけど。
WinXP までは PBT_APMQUERYSUSPEND メッセージに拒否応答すればスタンバイに落ちるのを回避できたのに、 Vista からはそれは無くなってて、 かわりに SetThreadExecutionState API を使えという話。
あらためて探してみたら、 いまだにあまり他には出てないみたいなので、 こっちにも転載。

MSDN フォーラム: .NETアプリ起動中のスタンバイ回避(Vista)
biac
2007年10月17日 8:10

MSDN Library を見ると、 かわりに SetThreadExecutionState API を使って、 タイムアウトしないようにすべしと書いてありますね。 でも、 ユーザ操作によるものは回避できないとか、 いろいろ制限が…

MSDN Library: Power Management Reference: WM_POWERBROADCAST Message (Windows)

    PBT_APMQUERYSUSPEND 0 0x0
    Request for permission to suspend. In Windows Server 2008 and Windows Vista, use the SetThreadExecutionState function instead.
    ( …中略… )
    To prevent the system from transitioning to a low-power state in Windows Vista, an application must call SetThreadExecutionState to inform the system that it is in use.

MSDN Library: Power Management Reference: SetThreadExecutionState Function

    Calling SetThreadExecutionState without ES_CONTINUOUS simply resets the idle timer; to keep the display or system in the working state, the thread must call SetThreadExecutionState periodically.
    To run properly on a power-managed computer, applications such as fax servers, answering machines, backup agents, and network management applications must use ES_SYSTEM_REQUIRED | ES_CONTINUOUS when they process events.
    ( …中略… )
    The SetThreadExecutionState function cannot be used to prevent the user from putting the computer in standby mode.
    ( …中略… )
    This function does not stop the screen saver from executing either.

MSDN Library: Power and Device Awareness: The Power-Aware Application

    You can use the SetThreadExecutionState function to disable the idle-to-sleep and display-blanking time-outs.
    ( …中略… )
    Be sure to restore the time-out periods after your operation is completed.

ただし、 これで回避できるのは、 一定時間アイドルだったときにスタンバイ/スリープさせる設定だけです。 ユーザーがスタートメニューや電源ボタンを使った場合は、 回避できません。
なお、 SetThreadExecutionState API 自体は Win2k から実装されていたようです。

また、 C# から SetThreadExecutionState API を呼び出す方法は、 WinXP 時代のものですが、 MSDN にあります。

モバイル PC の電源管理 (June 2005) ~ 省電力イベントの処理

[FlagsAttribute]   
public enum EXECUTION_STATE :uint
{
  ES_SYSTEM_REQUIRED  = 0x00000001,
  ES_DISPLAY_REQUIRED = 0x00000002,
  // 古いフラグは使用しないでください。
  // ES_USER_PRESENT   = 0x00000004,
  ES_CONTINUOUS       = 0x80000000,
}

[DllImport("Kernel32.DLL", CharSet = CharSet.Auto,
  SetLastError = true)]
private extern static
  EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE state);

※ EXECUTION_STATE フラグの使い方は、 SetThreadExecutionState 関数の解説を参照のこと。 ( ただし、 Vista 以降に追加された ES_AWAYMODE_REQUIRED と ES_USER_PRESENT については、 英語版にしか載っていない。 )

そのほか、 Windows Hardware Developer Central にある以下のページが参考になりそうです。

電源イベント監視ツールのサンプル アプリケーション
最終更新日: 2006年9月22日

電源イベント監視ツールのサンプル アプリケーションは、Microsoft Windows Vista オペレーティング システムにおける電源管理インフラストラクチャ、機能、およびユーザー エクスペリエンスの重要な変更について、実例で示しています。

Windows Vista におけるアプリケーションの電源管理のベスト プラクティス
最終更新日: 2007年12月5日

このホワイト ペーパーの内容 :

  • スリープとレジューム移行を処理する
  • システムのアイドル タイムアウトを防ぐ
  • バッテリの寿命を延ばすように設計する
  • 一般的な電源イベントに応答する
  • エンターテイメント PC シナリオやメディア PC シナリオ向けに設計する
  • マネージ コードの電源管理 API を使用する
  • 以前のバージョンの Windows 向けに設計する
  • Windows サービスの電源イベントに応答する
  • 電源管理用のアプリケーションをテストする

|

« [NEWS] 太陽風が水を創る | トップページ | [Windows7] 一般向けパッケージの予約販売が始まりました »

プログラミング」カテゴリの記事

コメント

PBT_APMQUERYSUSPEND メッセージが 「無くなった」 という言い方は、 ちょっと違うのかもしれませんが、 旧来の動作をしなくなったのは確かみたいですよ。

本文に挙げた 「Windows Vista におけるアプリケーションの電源管理のベスト プラクティス」 にも、 次のように書いてあります。
/*
Windows Vista includes two primary changes to sleep and resume events:
・The PBT_APMQUERYSUSPEND event is no longer delivered to applications.
(…後略)
*/

投稿: biac | 2009年9月25日 (金) 14時20分

>Vista からはそれは無くなってて

無くなっちゃったんですかねぇ?
互換性のために、残ってはいるような気もしますが。

コンソールアプリケーションのことなんかも考えると(サービスも?)「代わりに新設の API を使え」ってのは納得。

投稿: 渋木宏明(ひどり) | 2009年9月25日 (金) 11時58分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [.NET] プログラム実行中のスタンバイ回避 (Vista):

« [NEWS] 太陽風が水を創る | トップページ | [Windows7] 一般向けパッケージの予約販売が始まりました »