VB.NET二重起動をした時に既に起動中のアプリケーションをアクティブにする

  • C#
  • VB.NET

スポンサーリンク

二重起動 (多重起動) を防止するついでに、既に起動中だったプログラムのメインウィンドウをアクティブにします。残念ながら .NET Framework では、他のプログラムのウィンドウを操作することはできません。Win32API に頼らざるを得ないので、お勧めはできません。(Microsoft.VisualBasic.AppActicate メソッドを使う方法もありますが、アンマネージドです)

ここでは、既に起動中のプログラムのメインウィンドウをアクティブにし True を返す関数を紹介します。起動中でなければ、False を返しますので、エントリポイントで合わせて使うことができます。

サンプルコード

以下にサンプルコードを示します。

VB.NET 全般
Option Strict On

' 以下の名前空間をインポートする
Imports System.Diagnostics
Imports System.Runtime.InteropServices

Public Class MyProcess

    <DllImport("USER32.DLL", CharSet:=CharSet.Auto)> _
    Private Shared Function ShowWindow( _
        ByVal hWnd     As System.IntPtr, _
        ByVal nCmdShow As Integer) As Integer
    End Function

    <DllImport("USER32.DLL", CharSet:=CharSet.Auto)> _
    Private Shared Function SetForegroundWindow( _
        ByVal hWnd As System.IntPtr) As Boolean
    End Function

    Private Const SW_NORMAL As Integer = 1

    ''' ------------------------------------------------------------------------------------
    ''' <summary>
    '''     同名のプロセスが起動中の場合、メイン ウィンドウをアクティブにします。</summary>
    ''' <returns>
    '''     既に起動中であれば True。それ以外は False。</returns>
    ''' ------------------------------------------------------------------------------------
    Public Shared Function ShowPrevProcess() As Boolean
        Dim hThisProcess   As Process   = Process.GetCurrentProcess()
        Dim hProcesses     As Process() = Process.GetProcessesByName(hThisProcess.ProcessName)
        Dim iThisProcessId As Integer   = hThisProcess.Id

        For Each hProcess As Process In hProcesses
            If hProcess.Id <> iThisProcessId Then
                Call ShowWindow(hProcess.MainWindowHandle, SW_NORMAL)
                Call SetForegroundWindow(hProcess.MainWindowHandle)
                Return True
            End If
        Next hProcess

        Return False
    End Function

End Class

使用例は以下のようになります。

VB.NET 全般
<System.STAThread()> _
Protected Shared Sub Main()
    ' 同名のプロセスが起動していない時は起動する
    If MyProcess.ShowPrevProcess() = False Then
        Application.Run(New Form1())
    End If
End Sub

関連するリファレンス

準備中です。

スポンサーリンク