二重起動をした時に既に起動中のアプリケーションをアクティブにする
- 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
関連するリファレンス
準備中です。