シャットダウンやログオフされたときに、SessionEnding イベントで検知できるということを最近知りました。そのSessionEnding イベントについて質問です。
そのサンプルプログラムを作成してみたのですが、プロジェクトのプロパティで設定するスタートアップがForm1だと、シャットダウン時に正常にSessionEnding イベント内の処理に入ります。しかし、スタートアップがSub Mainだとシャットダウン時にSessionEnding イベント内の処理に入ってくれません。
スタートアップをSub Mainに設定してSessionEnding イベントを使用したいのに、それができない状態です。
なので、スタートアップをSub Mainに設定してSessionEnding イベントを使用する方法を教えてください。
イベントループがないと
イベントは拾えません。
あんさん、回答ありがとうございます。
イベントループがないとイベントが拾えないということですが、
私はイベントループというものを詳しく知りません。
ネットで調べてみて、イベントを拾うために常にループさせる処理のこと
というのはわかったのですが、それをどうやればよいのかわかりません。
私の作成したシャットダウン検出プログラムは、ボタンクリックイベント
や、フォームロードイベントなどは拾えます。
ということはそれらはイベントループしているということでしょうか?
SessionEnding イベントだけ拾えないというのは、これだけイベント
ループしていないということでしょうか?
これ以上はソースがないので
推測になるので答えられません。
私の作成したシャットダウン検出プログラムは下記のようになってます。
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()の処理に入ってくれるのか
教えてください。
Application.Run(New Form1())
では どうですか?
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()の処理
に入ったのかを教えてください。
なぜfrm.ShowDialog()では
SystemEvents_SessionEnding()の処理に入らず、
Application.Run()ではSystemEvents_SessionEnding()の処理
に入ったのかですが、自分でApplication.Run()を
調べてみました。
Application.Run()でフォームを呼び出すことにより、
イベントループを行ってくれるということですね。
ツイート | ![]() |