2 using System.Collections.Generic;
4 using System.Threading.Tasks;
5 using System.Windows.Forms;
6 using System.Diagnostics;
7 using System.Runtime.InteropServices;
15 /// アプリケーションのメイン エントリ ポイントです。
20 // 以下、DOBON.NETを参照した。mutexを使って二重起動を抑制。
21 //Mutex名を決める(必ずアプリケーション固有の文字列に変更すること!)
22 string mutexName = "DTX2WAV";
24 System.Threading.Mutex mutex = new System.Threading.Mutex(false, mutexName);
26 bool hasHandle = false;
32 hasHandle = mutex.WaitOne(0, false);
34 //.NET Framework 2.0以降の場合
35 catch (System.Threading.AbandonedMutexException)
37 //別のアプリケーションがmutexを解放しないで終了した時
40 #region [ mutexを得られなければ、既に起動済みと判断して、そっちを最前面に出して、こっちは終了 ]
41 if (hasHandle == false)
43 //得られなかった場合は、すでに起動していると判断して終了
44 //MessageBox.Show("多重起動はできません。");
46 // 得られなかった場合は、既に起動していると判断して、
48 Process prevProcess = GetPreviousProcess();
49 if (prevProcess != null)
51 WakeupWindow(prevProcess.MainWindowHandle);
57 #region [ DTXMania本体が既に起動されていないか確認する。既に起動済みなら警告して終了 ]
58 Process dtxmaniaProcess = GetProcessesByFileName("DTXManiaGR.exe");
59 if (dtxmaniaProcess != null)
62 "既にDTXMania本体が起動しています。DTX2WAVを起動する前に、DTXMania本体を終了してください。",
65 MessageBoxIcon.Exclamation
72 #region [ アプリを通常通り起動する ]
73 Application.EnableVisualStyles();
74 Application.SetCompatibleTextRenderingDefault(false);
75 Application.Run(new Main());
92 // 実行中の同じアプリケーションのプロセスを取得する
93 // http://www.atmarkit.co.jp/fdotnet/dotnettips/151winshow/winshow.html
94 public static Process GetPreviousProcess()
96 Process curProcess = Process.GetCurrentProcess();
97 Process[] allProcesses = Process.GetProcessesByName(curProcess.ProcessName);
99 foreach (Process checkProcess in allProcesses)
102 if (checkProcess.Id != curProcess.Id)
104 // プロセスのフルパス名を比較して同じアプリケーションか検証
106 checkProcess.MainModule.FileName,
107 curProcess.MainModule.FileName, true) == 0)
115 // 同じアプリケーションのプロセスが見つからない!
120 /// 指定した実行ファイル名のプロセスを取得する。
121 /// https://dobon.net/vb/dotnet/process/getprocessesbyfilename.html
123 /// <param name="searchFileName">検索する実行ファイル名。</param>
124 /// <returns>最初に一致したProcess。</returns>
125 public static System.Diagnostics.Process GetProcessesByFileName(string searchFileName)
127 searchFileName = searchFileName.ToLower();
130 foreach (System.Diagnostics.Process p
131 in System.Diagnostics.Process.GetProcesses())
137 fileName = p.MainModule.FileName;
139 catch (System.ComponentModel.Win32Exception)
144 if (0 < fileName.Length)
147 fileName = System.IO.Path.GetFileName(fileName);
148 //探しているファイル名と一致した時、コレクションに追加
149 if (searchFileName.Equals(fileName.ToLower()))
161 // 外部プロセスのウィンドウを最前面にする
162 // http://www.atmarkit.co.jp/fdotnet/dotnettips/151winshow/winshow.html
163 public static void WakeupWindow(IntPtr hWnd)
165 // メイン・ウィンドウが最小化されていれば元に戻す
168 ShowWindowAsync(hWnd, SW_RESTORE);
171 // メイン・ウィンドウを最前面に表示する
172 SetForegroundWindow(hWnd);
174 // 外部プロセスのメイン・ウィンドウを起動するためのWin32 API
175 [DllImport("user32.dll")]
176 private static extern bool SetForegroundWindow(IntPtr hWnd);
177 [DllImport("user32.dll")]
178 private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
179 [DllImport("user32.dll")]
180 private static extern bool IsIconic(IntPtr hWnd);
181 // ShowWindowAsync関数のパラメータに渡す定義値
182 private const int SW_RESTORE = 9; // 画面を元の大きさに戻す