二重起動を禁止する方法について

Cc440887.download(ja-jp,MSDN.10).gif サンプル コードのダウンロード (vbmigtips_Process_mutex.exe, 90.7 KB)

プロジェクトによっては、作成したアプリケーションを同時に複数起動できないようにしたい場合があると思います。そこで今回は、二重起動を禁止する方法について紹介します。

Visual Basic 6.0 では、App.PrevInstance プロパティを使用します。実装コードは以下のとおりです。

Public Sub Main()
If App.PrevInstance Then
End
Else
Dim m_form1 As New Form1
Call m_form1.Show(vbModal)
End If
End Sub

リスト1

上記 (リスト1) の「If App.PrevInstance Then」でアプリケーションのインスタンスが生成されているかを確認し、生成されている時は「End」でアプリケーションを終了します。一方、インスタンスが生成されていない時は「Call m_form1.Show(vbModal)」で Form1 を表示します。これにより、アプリケーションの二重起動を防ぐことができます。

一方、Visual Basic .NET では、Visual Basic 6.0 の App.PrevInstance プロパティを使用した方法と同等の方法で実装することはできません。しかし、対象となるプロセス名を確認することで、二重起動を禁止することができます。これは、Visual Basic 6.0 の App.PrevInstance プロパティを使用した方法に似た方法です。実装コードは以下のとおりです。

<STAThread()> _
Protected Shared Sub Main()
If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) = 0 Then
Application.Run(New Form1)
Else
Application.Exit()
End If
End Sub

リスト2

上記 (リスト2) の「If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) = 0 Then」で、同名のプロセスを持ったアプリケーションが存在するかどうかを確認し、存在しない場合は「Application.Run(New Form1)」でアプリケーションを Form1 から起動します。一方、存在する場合は、「Application.Exit()」でアプリケーションを終了します。

リスト2 では Visual Basic 6.0 の App.PrevInstance プロパティを使用した方法に似た処理を行う実装方法を紹介しましたが、Visual Basic .NET では、Mutex クラスを使用して二重起動を禁止させることもできます。実装コードは以下のとおりです。

<STAThread()> _
Protected Shared Sub Main()
Dim hMutex As New System.Threading.Mutex(False, Application.ProductName)
If hMutex.WaitOne(0, False) = True Then
GC.KeepAlive(hMutex)
Application.Run(New Form1)
Else
Application.Exit()
End If
hMutex.Close()
End Sub

リスト3

上記 (リスト3) の「Dim hMutex As New System.Threading.Mutex(False, Application.ProductName)」で Mutex を生成し Mutex の名前にアセンブリ名を付けます。これはプロセスを判断する識別名として設定します。「If hMutex.WaitOne(0, False) = True Then」でMutex のシグナルを受信できるか確認し、受信できる場合は、「Application.Run(New Form1)」でアプリケーションを Form1 から起動します。一方、受信できない場合は、「Application.Exit()」でアプリケーションを終了します。最後に「hMutex.Close()」で Mutex を解放します。
リスト3 のように Mutex クラスを使用することで、たとえ、実行ファイル名を変更しても二重起動を禁止することができます。