C#:外部アプリケーションの二重起動を防止する

C#:外部アプリケーションの二重起動を防止するC#
スポンサーリンク

C#のフォームアプリから外部アプリケーションを起動した際の二重起動を防止する手順を説明します。

ただしすでに別の操作によって指定のアプリが起動している場合、同じアプリが起動することになります。
例として、メモ帳がすでに起動した状態で、C#のフォームアプリからメモ帳の二重起動を防止することは出来ないということになります。

通常の外部アプリケーションの起動方法に関しては、以下の記事をご覧ください。

C#:外部アプリケーションを起動する
C#のフォームアプリから外部のアプリケーションを起動する手順を説明します。 結論から言うとProcessクラスを使...
スポンサーリンク

プロジェクトの作成

ファイル >新規作成 >プロジェクト… からWindowsフォームアプリケーションを選択してください。

プロジェクト名は外部アプリケーションの二重起動を防止するとしておきます。

フォームにボタンを1つ貼り付けてください。

C#:外部アプリケーションを起動する

準備は、以上です。

外部アプリケーションの二重起動を防止する手順

外部アプリケーションの起動に関してはProcessクラスのインスタンスを用いて作成します。
以下は外部アプリを起動するための事前の設定です。この時点では、まだアプリは起動しません。

例)メモ帳を起動する場合

// プロセスのインスタンスを生成
myProcess = new Process();
// 起動するアプリケーション名を設定
myProcess.StartInfo.FileName = "notepad.exe";

プロセスの起動は、ProcessクラスのStartメソッドを使います。

// プロセスを起動
myProcess.Start();

プロセスが起動しているかの確認はProcessクラスのHasExitedプロパティを使います。

.NET Framework 4.7.2 – Process.HasExitedプロパティ

HasExitedプロパティ(戻り値はboolean型)

プロセスが終了している場合はtrue。それ以外の場合はfalseを返す。
ただし一度もプロセスを起動していないと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文で処理が可能となります。

実行イメージ

ボタンをクリックして、メモ帳を起動してみる
C#:外部アプリケーションの二重起動を防止する

もう一度ボタンを押してみる(すでに起動済みのメッセージが表示される)
C#:外部アプリケーションの二重起動を防止する

プログラム全体(Form1.cs)

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

コメント