[.NET] プログラム実行中のスタンバイ回避 (Vista)
以前、 MSDN フォーラムに書いたことなんだけど。
WinXP までは PBT_APMQUERYSUSPEND メッセージに拒否応答すればスタンバイに落ちるのを回避できたのに、 Vista からはそれは無くなってて、 かわりに SetThreadExecutionState API を使えという話。
あらためて探してみたら、 いまだにあまり他には出てないみたいなので、 こっちにも転載。
MSDN フォーラム: .NETアプリ起動中のスタンバイ回避(Vista)
biac
2007年10月17日 8:10MSDN 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 にあります。
[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 サービスの電源イベントに応答する
- 電源管理用のアプリケーションをテストする
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
この記事へのコメントは終了しました。
コメント
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分