システムのスリープからの復帰時にコマンドを起動するビヘイビア

アプリケーションが起動している最中のシステムの電源状態の変更(スリープ状態への移行、スリープ状態からの復帰)時に、特定の処理を行いたい場合に利用することができる、WPF 用のビヘイビア PowerModeChangedBehavior を作成しました。MakViewModelBase に組み込んでいます。

仕組みは次のようになっています。

  • ICommand インターフェイス型の依存関係プロパティ CommandProperty を持つ。
  • Window オブジェクトへのアタッチ及びデタッチ時に SystemEvents.PowerModeChanged イベントへイベントハンドラをアタッチ及びデタッチする。
  • イベントハンドラでは、PowerModeChangedEventArgs を引数にセットし、CommandProperty に設定されたコマンドを起動する。

使用例は次のとおりです。

実行時の画面(実行後にシステムをスリープ状態にし、その後スリープ状態から復帰させたときのもの)。

実行時の画面
実行時の画面

使用例のプログラム。
WPF のプロジェクト「Eventhandle_Resume」を作成し、NuGet から MakViewModelBase をインストールしておきます。

まずは、ビューモデル。
プロジェクトに ViewModels フォルダを作成し、MainViewModel クラスを作成します。

using System.Windows.Input;

using MakCraft.ViewModels;

namespace Eventhandle_Resume.ViewModels
{
    class MainViewModel : ViewModelBase
    {
        public string Info
        {
            get { return _info; }
            set
            {
                base.SetProperty(ref _info, value);
            }
        }
        private string _info;

        private void resumeEventHandlerExecute(Microsoft.Win32.PowerModeChangedEventArgs e)
        {
            switch (e.Mode)
            {
                case Microsoft.Win32.PowerModes.Suspend:
                    Info += string.Format("スリープになりました。\r\n");
                    break;
                case Microsoft.Win32.PowerModes.Resume:
                    Info += string.Format("スリープから復帰しました。\r\n");
                    break;
            }
        }
        private RelayCommand<Microsoft.Win32.PowerModeChangedEventArgs> _resumeEventhandlerCommand;
        public ICommand ResuomeEventHandlerCommand
        {
            get
            {
                if (_resumeEventhandlerCommand == null)
                {
                    _resumeEventhandlerCommand =
                        new RelayCommand<Microsoft.Win32.PowerModeChangedEventArgs>(resumeEventHandlerExecute);
                }
                return _resumeEventhandlerCommand;
            }
        }
    }
}

ICommand 型のプロパティ ResuomeEventHandlerCommand の get アクセサーにて、ジェネリックな RelayCommand クラスのインスタンス _resumeEventhandlerCommand を作成し、View 側へ渡すようになっています。コマンド実行の本体 resumeEventHandlerExecute(Microsoft.Win32.PowerModeChangedEventArgs e) メソッドでは、PowerModeChangedEventArgs クラスの Mode プロパティの値でスリープ移行とスリープからの復帰の状態遷移を判断しています。

次に MainWindow.xaml です。

<Window x:Class="Eventhandle_Resume.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:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:mb="clr-namespace:MakCraft.Behaviors;assembly=MakViewModelsBase"
        xmlns:vm="clr-namespace:Eventhandle_Resume.ViewModels"
        xmlns:local="clr-namespace:Eventhandle_Resume"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <vm:MainViewModel />
    </Window.DataContext>

    <i:Interaction.Behaviors>
        <mb:PowerModeChangedBehavior Command="{Binding ResuomeEventHandlerCommand}" />
    </i:Interaction.Behaviors>

    <StackPanel>
        <TextBlock
            Margin="4" HorizontalAlignment="Center" FontSize="18"
            Text="レジュームの通知をハンドリング" />

        <TextBox
            Margin="4" FontSize="14" MinHeight="100" MinWidth="100" IsReadOnly="True"
            Text="{Binding Info}" />
    </StackPanel>
</Window>

View 側では、XAML 名前空間宣言と Window への PowerModeChangedBehavior ビヘイビアの付加・Command 依存関係プロパティへのバインディングを行っています。

MakViewModelBase は GitHub 上にリポジトリがあるので、ソースを見たい方はリポジトリを参照してください。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です