実現したいこと
ボタン作成し、それをクリックして、実行ファイル起動する。
この実行ファイルの起動の上限数は1つまでとします。
再度ボタンが押されると先に出ていたものが閉じて終了する。
終了後に、実行ファイルの起動するような処理を行いたいです。
発生している問題・分からないこと
・1回目押下で、起動します。2回目の押下でも起動し、三回目から2回目に起動したものが削除されます。
2回目で削除されるようにしたいのですがうまくいきません。
※現状は削除ではなく、新たな起動しないようにし、メッセージを出力しています。
・異なるexe間でボタンを押しても、それぞれで上記の同じ動作をしています。
異なるexe間での起動と削除のプロセスを一つにまとめたいです。
・Processの探し方についてもよい方法がわからないです。
これについては、方法や探すもとになる値を列挙いただけるとありがたいです。
該当のソースコード
C#
1//以下のボタン押下後の共通コードです。 2 public class MutexHelper 3 { 4 private static Mutex mutex = new Mutex(false, "Global\\MyUniqueHelpFileMutex"); 5 private static bool isHelpFileRunning = false; 6 7 public static async Task OpenHelpFileAsync() 8 { 9 await Task.Run(() => OpenHelpFile()); 10 } 11 12 private static void OpenHelpFile() 13 { 14 bool hasHandle = false; 15 Process process = null; 16 try 17 { 18 try 19 { 20 hasHandle = mutex.WaitOne(TimeSpan.Zero, false); 21 } 22 catch (AbandonedMutexException) 23 { 24 hasHandle = true; 25 } 26 27 if (!hasHandle) 28 { 29 Console.WriteLine("ヘルプファイルはすでに開かれています。"); 30 return; 31 } 32 33 // "notepad.exe" が既に起動しているかどうかをチェック 34 if (!isHelpFileRunning) 35 { 36 isHelpFileRunning = true; 37 process = Process.Start("notepad.exe"); 38 } 39 else 40 { 41 Console.WriteLine("ヘルプファイルはすでに開かれています。"); 42 } 43 } 44 finally 45 { 46 if (hasHandle) 47 { 48 mutex.ReleaseMutex(); 49 } 50 } 51 52 // プロセスの終了を待機 53 if (process != null) 54 { 55 process.WaitForExit(); 56 isHelpFileRunning = false; 57 } 58 } 59 60 } 61 62//フォーム側では以下のように呼び出しています。 63private async void button1_Click(object sender, EventArgs e) 64{ 65 66 await MutexHelper.OpenHelpFileAsync(); 67}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
実現にはMutexと非同期処理が現実的だとことでそれらを使って進めてます。
現状のコードはChartGPTを大本に細かい部分(分岐方法など)を自分なりに変更しました。
補足
ご指摘いただけるとありがたいです。
回答2件
あなたの回答
tips
プレビュー