DOBON.NET

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

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をご利用いただく際は、注意事項をお守りください。
共有する

この記事への評価
良い / 悪い = 22 / 1

この記事へのコメント
通常のコメント [ まけろう ] 2010年12月8日 06:03:39
とても勉強になります。

通常のコメント [ かすみ ] 2009年4月17日 02:30:13
シャットダウンだけではなくて、再起動の場合でもイベントを受け取ります。
スタンバイ、休止状態は受け取れません。

通常のコメント [ フレーク ] 2008年12月23日 15:12:27
とても見やすく分かりやすい

.NET Frameworkのバージョンによる違い [ おがわ ] 2007年9月21日 03:48:01
本処理、実に助かりました。
ただ、困った事にVISTAでは機能しません。
正確にはイベントは入るのですが、.canselが
効かないです。効いてないのではなくて、イベントを
キャンセルしても無視しているかもしれません。
XPだと効くのでやり方は間違っていないと
思います。

何かわかりますか?

評価の理由 [ urara ] 2004年2月13日 05:05:55
評価:良い
ページのつくりが非常に見やすいです。


この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームへ移動します。通常のご質問、ご意見等は掲示板へご投稿ください。