シャットダウンイベントの検知の仕方

解決


トシ  2006-11-24 19:48:41  No: 134284

シャットダウンやログオフされたときに、SessionEnding イベントで検知できるということを最近知りました。そのSessionEnding イベントについて質問です。
そのサンプルプログラムを作成してみたのですが、プロジェクトのプロパティで設定するスタートアップがForm1だと、シャットダウン時に正常にSessionEnding イベント内の処理に入ります。しかし、スタートアップがSub Mainだとシャットダウン時にSessionEnding イベント内の処理に入ってくれません。
スタートアップをSub Mainに設定してSessionEnding イベントを使用したいのに、それができない状態です。
なので、スタートアップをSub Mainに設定してSessionEnding イベントを使用する方法を教えてください。


あん  2006-11-24 23:59:53  No: 134285

イベントループがないと
イベントは拾えません。


トシ  2006-11-25 21:09:16  No: 134286

あんさん、回答ありがとうございます。
イベントループがないとイベントが拾えないということですが、
私はイベントループというものを詳しく知りません。
ネットで調べてみて、イベントを拾うために常にループさせる処理のこと
というのはわかったのですが、それをどうやればよいのかわかりません。
私の作成したシャットダウン検出プログラムは、ボタンクリックイベント
や、フォームロードイベントなどは拾えます。
ということはそれらはイベントループしているということでしょうか?
SessionEnding イベントだけ拾えないというのは、これだけイベント
ループしていないということでしょうか?


あん  2006-11-26 20:03:17  No: 134287

これ以上はソースがないので
推測になるので答えられません。


トシ  2006-11-27 00:33:25  No: 134288

私の作成したシャットダウン検出プログラムは下記のようになってます。

Imports Microsoft.Win32

Public Class Form1
    Inherits System.Windows.Forms.Form

" Windows フォーム デザイナで生成されたコード "

    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
        'イベントを開放する
        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

End Class

また、上記のソースはスタートアップをForm1にしています。
スタートアップをSub Mainにしたものは、下記を加えただけとなっています。

Module MainModule

    Dim frm As New Form1

    Sub main()
        frm.ShowDialog()
    End Sub
End Module

このプログラムで、スタートアップをSub Mainにしたものは、
シャットダウン時にSystemEvents_SessionEnding()の処理に入りません。
どうしたらSystemEvents_SessionEnding()の処理に入ってくれるのか
教えてください。


あん  2006-11-27 01:49:47  No: 134289

Application.Run(New Form1())
では  どうですか?


トシ  2006-11-29 01:49:38  No: 134290

Application.Run(New Form1())
で、下記のようにプログラムを修正してやってみました。
そしたら、うまくいきました。
ありがとうございました。

Module MainModule

    Dim frm As New Form1

    Sub main()
        Application.Run(frm)
    End Sub
End Module

もしよろしければ、なぜfrm.ShowDialog()では
SystemEvents_SessionEnding()の処理に入らず、
Application.Run()ではSystemEvents_SessionEnding()の処理
に入ったのかを教えてください。


トシ  2006-11-29 01:58:17  No: 134291

なぜfrm.ShowDialog()では
SystemEvents_SessionEnding()の処理に入らず、
Application.Run()ではSystemEvents_SessionEnding()の処理
に入ったのかですが、自分でApplication.Run()を
調べてみました。

Application.Run()でフォームを呼び出すことにより、
イベントループを行ってくれるということですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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