このエントリーをはてなブックマークに追加


サスペンド前・復帰の時に処理を行いたい時のサンプルコード

PCがサスペンドに入る前にネットワークを閉じたい、ファイルを一時保存しておきたいなどスリープ状態になる前に処理を実行したい。
同様にスリープ復帰後に処理を行いたい場合のサンプルコードを以下に記します。

PowerModesのイベントによる処理になります。
電源の抜き差し(ノートPCのAC電源駆動、バッテリ駆動の処理も実装してあります。

動作確認環境

  • Windows 10 ver. 21H1
  • Visual Studio 2019
  • WPFアプリケーション
  • .NET Framework 4.7.2

ソリューションファイル

本記事で作成したソリューション(プロジェクト一式)は以下からダウンロードできます。

参考サイト

実行結果

以下のキャプチャの通り、電源状態が変わった場合(今回はAC駆動、バッテリ駆動のみ判定)、スリープ前、スリープから復帰時にTextBlockに
時間とメッセージを追記しています。
スリープ前、スリープ復帰時にメッセージが追記されているのができます。
AC ON|OFF Line はノートPCから電源ケーブルを抜き差しすると出力されます。

01.png

C# サンプルコード

サンプルコードは、上記参考サイトを利用させて頂き追記しました。
WPFのため、SystemInformation.PowerStatusは使えず(System.Windows.Formsのため)、UWPのWindows.Devices.Powerを使うための設定も面倒なので、
DllImportによりGetSystemPowerStatusを使う方法で、AC駆動、バッテリ駆動を判別しています。

以下、追記・修正したファイルのみとなります。

MainWindow.xaml

<Window x:Class="SuspendResume.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SuspendResume"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="400">
    <Grid>
        <TextBlock Name="MsgTxtBlk" />
    </Grid>
</Window>

MainWindow.xaml.cs

using Microsoft.Win32;
using System;
using System.Runtime.InteropServices;
using System.Windows;

namespace SuspendResume
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MsgTxtBlk.Text = "Start" + Environment.NewLine; ;
            MonitorPowerModes();
        }

        private void MonitorPowerModes()
        {
            SystemEvents.PowerModeChanged += (sender, e) =>
            {
                string nowTime = DateTime.Now.ToString("HH:mm:ss");

                switch (e.Mode)
                {
                    case PowerModes.Suspend:
                        MsgTxtBlk.Text += nowTime + " - Suspend" + Environment.NewLine;
                        break;
                    case PowerModes.Resume:
                        MsgTxtBlk.Text += nowTime + " - Resume" + Environment.NewLine;
                        break;
                    case PowerModes.StatusChange:
                        MsgTxtBlk.Text += nowTime + " - " + ACLineStatusMsg() + Environment.NewLine;
                        break;
                    default:
                        MsgTxtBlk.Text += nowTime + " - Unknown" + Environment.NewLine;
                        break;
                }
            };
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct SYSTEM_POWER_STATUS
        {
            public byte ACLineStatus;
            public byte BatteryFlag;
            public byte BatteryLifePercent;
            public byte Reserved1;
            public int BatteryLifeTime;
            public int BatteryFullLifeTime;
        }

        [DllImport("kernel32.dll")]
        static extern bool GetSystemPowerStatus(out SYSTEM_POWER_STATUS lpSystemPowerStatus);

        private string ACLineStatusMsg()
        {
            SYSTEM_POWER_STATUS sps = new SYSTEM_POWER_STATUS();
            _ = GetSystemPowerStatus(out sps);

            string msg = "";

            switch (sps.ACLineStatus)
            {
                case 0:
                    msg = "AC OFF line.";
                    break;
                case 1:
                    msg = "AC ON line.";
                    break;
                case 255:
                default:
                    msg = "Unknown.";
                    break;
            }
            return msg;
        }
    }
}

以上、サスペンド前、サスペンド復帰時に処理を記述する方法でした。


添付ファイル: file01.png 122件 [詳細] fileSuspendResume.zip 137件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-10-06 (水) 20:53:26