ここでは、アプリケーション(Windowsフォームアプリケーション)が開始した直後、または終了する直前に何かしたい場合、そのコードをどこに書けばよいかについて説明します。
なおここで紹介する方法は、メインフォームが作成される前、あるいは破棄された後に何か行いたい場合に役に立つ方法です。もしメインフォームがロードされた直後、あるいは閉じられた直後でよいのであれば、LoadイベントやFormClosedイベントを使用する方法で十分です。
アプリケーションが開始すると、まずエントリポイントメソッド(Mainメソッド)が呼び出されます。そして、エントリポイントメソッドから抜けるとアプリケーションが終了します。つまり、アプリケーションの開始時に行う処理はエントリポイントメソッドの先頭に記述し、アプリケーションの終了時に行う処理はエントリポイントメソッドの最後に記述します。
Windowsフォームアプリケーションの場合は、Mainメソッド内にApplication.Runメソッドを呼び出している箇所がありますので、アプリケーション開始時の処理はその前に、アプリケーション終了時の処理はその後に記述すればよいでしょう。
エントリポイントメソッドについて詳しくは「アプリケーションのエントリポイントを自作する」で説明していますので、そちらをご覧ください。
Visual Studio 2005以降のVB.NETでは、My.Application.Startupイベントでアプリケーションが開始されたことを知ることができます。また、My.Application.Shutdownイベントでアプリケーションが終了されることを知ることができます。
ただし、これらのイベントを使うためには、アプリケーションフレームワークを有効にしなければなりません。アプリケーションフレームワークを有効にするには、メニューの「プロジェクト」-「プロパティ」でプロジェクトのプロパティを表示し、「アプリケーション」タブにある「アプリケーションフレームワークを有効にする」にチェックを入れます。
これらのイベントハンドラは、"ApplicationEvents.vb"に記述すると便利です。"ApplicationEvents.vb"は、プロジェクトプロパティの「アプリケーション」タブにある「アプリケーションイベントの表示」ボタンをクリックすると表示できます。
"ApplicationEvents.vb"にMy.Application.StartupとShutdownイベントハンドラを記述した例を以下に示します。ここでは、アプリケーションの開始時と終了時にメッセージボックスを表示しています。
Namespace My Partial Friend Class MyApplication Private Sub MyApplication_Startup(ByVal sender As Object, _ ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) _ Handles Me.Startup 'メッセージボックスでNoを選択すると、アプリケーションを終了 'この場合、Shutdownイベントは発生しない If MsgBox("アプリケーションを開始しますか?", MsgBoxStyle.YesNo) = _ MsgBoxResult.No Then e.Cancel = True End If '指定されたコマンドライン引数を列挙 For Each cmd As String In e.CommandLine Console.WriteLine(cmd) Next End Sub Private Sub MyApplication_Shutdown(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Shutdown MsgBox("アプリケーションが終了します。") End Sub End Class End Namespace
Application.ApplicationExitイベントを使用すると、アプリケーションが終了することを知ることができます。ただしこの方法では、アプリケーションの開始を知ることはできません。
以下にその使用例を示します。ここではフォームのLoadイベントハンドラでApplicationExitイベントハンドラを追加していますが、実際には、エントリポイントの適当な位置(Application.Runメソッドを呼び出す前)に記述した方がよいでしょう。
'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Load 'ApplicationExitイベントハンドラを追加 AddHandler Application.ApplicationExit, AddressOf Application_ApplicationExit End Sub 'ApplicationExitイベントハンドラ Private Sub Application_ApplicationExit(ByVal sender As Object, ByVal e As EventArgs) MessageBox.Show("アプリケーションが終了されます。") 'ApplicationExitイベントハンドラを削除 RemoveHandler Application.ApplicationExit, AddressOf Application_ApplicationExit End Sub
//フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //ApplicationExitイベントハンドラを追加 Application.ApplicationExit += new EventHandler(Application_ApplicationExit); } //ApplicationExitイベントハンドラ private void Application_ApplicationExit(object sender, EventArgs e) { MessageBox.Show("アプリケーションが終了されます。"); //ApplicationExitイベントハンドラを削除 Application.ApplicationExit -= new EventHandler(Application_ApplicationExit); }