DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ログオフやシャットダウンをしようとしている時にイベントを受け取る、またキャンセルする

SystemEvents.SessionEndingイベントにより、ユーザーがシステムからログオフしようとしている、またはシステムをシャットダウンしようとしたことを知ることができます。またこのとき受け取るSessionEndingEventArgs型の引数のCancelプロパティをTrueにすることにより、セッションの終了要求をキャンセルできます。しかしこのときでも絶対にキャンセルされるというわけではありません。

VB.NET
コードを隠すコードを選択
'Imports Microsoft.Win32
'がソースファイルの一番上に書かれているものとする。

'ログオフ、シャットダウンの通知

Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) _
        Handles MyBase.Load
    'イベントをイベントハンドラに関連付ける
    'フォームコンストラクタなどの適当な位置に記述してもよい
    AddHandler SystemEvents.SessionEnding, _
        AddressOf SystemEvents_SessionEnding
End Sub

Private Sub Form1_Closed(ByVal sender As Object, _
        ByVal e As System.EventArgs) _
        Handles MyBase.Closed
    'イベントを解放する
    'フォームDisposeメソッド内の基本クラスのDisposeメソッド呼び出しの前に
    '記述してもよい
    RemoveHandler SystemEvents.SessionEnding, _
        AddressOf SystemEvents_SessionEnding
End Sub

'ログオフ、シャットダウンしようとしているとき
Private Sub SystemEvents_SessionEnding( _
        ByVal sender As Object, _
        ByVal e As SessionEndingEventArgs)
    Dim s As String
    If e.Reason = SessionEndReasons.Logoff Then
        s = "ログオフしようとしています。"
    ElseIf e.Reason = SessionEndReasons.SystemShutdown Then
        s = "シャットダウンしようとしています。"
    End If
    If MessageBox.Show(s + vbNewLine + "キャンセルしますか?", _
            "質問", MessageBoxButtons.YesNo) = DialogResult.Yes Then
        'キャンセルする
        e.Cancel = True
    End If
End Sub
C#
コードを隠すコードを選択
//using Microsoft.Win32;
//がソースファイルの一番上に書かれているものとする。

//ログオフ、シャットダウンの通知

private void Form1_Load(object sender, System.EventArgs e)
{
    //イベントをイベントハンドラに関連付ける
    //フォームコンストラクタなどの適当な位置に記述してもよい
    SystemEvents.SessionEnding +=
        new SessionEndingEventHandler(SystemEvents_SessionEnding);
}

private void Form1_Closed(object sender, System.EventArgs e)
{
    //イベントを解放する
    //フォームDisposeメソッド内の基本クラスのDisposeメソッド呼び出しの前に
    //記述してもよい
    SystemEvents.SessionEnding -=
        new SessionEndingEventHandler(SystemEvents_SessionEnding);
}

//ログオフ、シャットダウンしようとしているとき
private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
    string s = "";
    if (e.Reason == SessionEndReasons.Logoff)
    {
        s = "ログオフしようとしています。";
    }
    else if (e.Reason == SessionEndReasons.SystemShutdown)
    {
        s = "シャットダウンしようとしています。";
    }
    if (MessageBox.Show(s + "\n\nキャンセルしますか?",
        "質問", MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        //キャンセルする
        e.Cancel = true;
    }
}

SystemEvents.SessionEndedイベントは、ユーザーがシステムからログオフするか、システムをシャットダウンすると発生します。

また、SystemEventsクラスはその他にも、様々なシステムイベントを提供します。詳しくは、こちらをご覧ください。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。