C#のフォームアプリから外部アプリケーションを起動した際の二重起動を防止する手順を説明します。
例として、メモ帳がすでに起動した状態で、C#のフォームアプリからメモ帳の二重起動を防止することは出来ないということになります。
通常の外部アプリケーションの起動方法に関しては、以下の記事をご覧ください。

プロジェクトの作成
ファイル >新規作成 >プロジェクト… からWindowsフォームアプリケーションを選択してください。
プロジェクト名は外部アプリケーションの二重起動を防止するとしておきます。
フォームにボタンを1つ貼り付けてください。

準備は、以上です。
外部アプリケーションの二重起動を防止する手順
外部アプリケーションの起動に関してはProcessクラスのインスタンスを用いて作成します。
以下は外部アプリを起動するための事前の設定です。この時点では、まだアプリは起動しません。
例)メモ帳を起動する場合
// プロセスのインスタンスを生成 myProcess = new Process(); // 起動するアプリケーション名を設定 myProcess.StartInfo.FileName = "notepad.exe";
プロセスの起動は、ProcessクラスのStartメソッドを使います。
// プロセスを起動 myProcess.Start();
プロセスが起動しているかの確認はProcessクラスのHasExitedプロパティを使います。
.NET Framework 4.7.2 – Process.HasExitedプロパティ
HasExitedプロパティ(戻り値はboolean型)
ただし一度もプロセスを起動していないとHasExitedプロパティは、例外InvalidOperationExceptionを返す
今回HasExitedプロパティの戻り値と例外の戻り値を使って、二重起動の防止をしてみます。
外部アプリに対する二重起動防止の考え方
メモ帳=プロセスと置き換えて考えてください。
| 状態 | HasExistの戻り値 | 例外 | 処理 |
|---|---|---|---|
| 一度もメモ帳(プロセス)を起動していない場合 | ー | InvalidOperationException | メモ帳起動 |
| メモ帳が起動中 | false | ー | 「起動中です」のメッセージ表示 |
| メモ帳を一度起動したあとに終了した | true | ー | メモ帳を起動 |
プログラムに直すとこんな感じになります。
try
{
// プロセスが終了した
if (myProcess.HasExited)
{
myProcess.Start();
}
// プロセスが起動中
else
{
MessageBox.Show("起動してるよ");
}
}
// 一度もプロセスが起動していない
catch (InvalidOperationException ioe)
{
myProcess.Start();
Console.WriteLine(ioe.Message);
}
catch (Exception pe)
{
Console.WriteLine(pe.Message);
}
仮にProcessクラスのインスタンスを生成して起動アプリケーション名を設定していたとしても、一度もプロセスが実行されていない場合、HasExitedプロパティは例外InvalidOperationExceptionを返します。
今回はあえてこの例外の戻り値を利用しています。
2度目のプロセス起動からはHasExitedプロパティはtrue又はfalseを返すようになるため、戻り値によってif文で処理が可能となります。
実行イメージ
ボタンをクリックして、メモ帳を起動してみる

もう一度ボタンを押してみる(すでに起動済みのメッセージが表示される)

プログラム全体(Form1.cs)
ボタンイベント(button1_Click)とフォームロードイベント(Form1_Load)は、必ずデザイン画面のボタンとフォーム上でそれぞれダブルクリックして作成してください。


コメント