[C#]PCのサスペンド、レジュームをプログラムから検出する

概要

ノートPCでは、バッテリー消費を抑える為に、よくPCのサスペンド・レジュームが使用されます。
C#でPCのサスペンド・レジュームが行われたことを検出する為には、Microsoft.Win32.SystemEventsクラスのPowerModeChangedイベントにハンドラを登録します。


手順


動作確認用に、画面にTextBoxを1つ貼り付けます。




PowerModeChangedイベントを使用するために、まず、以下の形でイベントハンドラの登録・解除処理を作ります。
イベントハンドラはMicrosoft.Win32.SystemEventsクラスに登録します。

//********************************************************************************
/// <summary>コンストラクタ
/// </summary>
//********************************************************************************
public FormMain() {
    InitializeComponent();
 
    //---------------------
    // イベントを登録する
    //---------------------
    Microsoft.Win32.SystemEvents.PowerModeChanged += 
              new Microsoft.Win32.PowerModeChangedEventHandler( SystemEvents_PowerModeChanged );
}
 
//********************************************************************************
/// <summary>画面クローズ時のハンドラ
/// </summary>
//********************************************************************************
private void FormMain_FormClosed( object sender, FormClosedEventArgs e ) {
    //---------------------
    // イベントを解除する
    //---------------------
    Microsoft.Win32.SystemEvents.PowerModeChanged -= 
              new Microsoft.Win32.PowerModeChangedEventHandler( SystemEvents_PowerModeChanged );
}




その上で、イベントハンドラの中身(上記の例ではSystemEvents_PowerModeChanged()メソッド)を実装します。第二引数で、サスペンド・レジュームのどちらが行われたかを取得できます。

//********************************************************************************
/// <summary>電源状態変更時のハンドラ
/// </summary>
//********************************************************************************
private void SystemEvents_PowerModeChanged(object sender, 
                                             Microsoft.Win32.PowerModeChangedEventArgs e) {
    //----------------------
    // 現在時刻を取得
    //----------------------
    String sysdate = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
 
 
    //----------------------
    // 電源状態を画面に表示
    //----------------------
    switch (e.Mode) {
        case Microsoft.Win32.PowerModes.Suspend:
            txtLog.Text += sysdate + " サスペンドされました。" + Environment.NewLine;
            break;
        case Microsoft.Win32.PowerModes.Resume:
            txtLog.Text += sysdate + " レジュームされました。" + Environment.NewLine;
            break;
    }
}



プログラムを実行させ、実際にサスペンド・レジュームを行うと画面にログが表示されます。


補足

Win32.SystemEvents.PowerModeChangedのイベントハンドラで取得できる状態は、以下の3つです。

Resume:
オペレーティング システムが中断状態から再開されます。

StatusChange:
電源モードのステータス通知がオペレーティング システムで発生しました。
これは、バッテリ電力が低下した、バッテリの充電中、AC 電源とバッテリの間で移行しているなど、
システム電源のステータスが変化したことを示している可能性があります。

Suspend:
オペレーティング システムが中断されます。

参考文献

電源、バッテリーに関する情報を取得する
PowerModeChangedで取得可能な状態一覧
休止状態復帰を検知しスクリプトを実行したい。


関連記事

コメントを残す

メールアドレスが公開されることはありません。