Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

C# 二重起動を防止する方法(Windowsフォーム .NET6.0)

C# で Mutex を使わずに、アプリケーションの多重起動を抑止する方法を書いていきます。

プロジェクトの概要

今回のコードは、以下のプロジェクトで検証しました。

プロジェクトの識別子

以下の値は「SingleInstance」にしています。

  • ソリューション名
  • プロジェクト名
  • 名前空間

プログラムの編集

テンプレートのプログラムを、以下の内容に変更して保存します。

Program.cs

using System.Diagnostics;

namespace SingleInstance {
  internal static class Program {
    [STAThread]
    static void Main() {
      if (IsSingleInstance()) {
        ApplicationConfiguration.Initialize();
        Application.Run(new Form1());
      }
    }
    private static bool IsSingleInstance() {
      // 配列には自分のプロセスも格納されるため、
      // 同じプロセス名が存在しない場合の長さは1になります。
      Process[] proc = Process.GetProcessesByName(
        Process.GetCurrentProcess().ProcessName
      );
      return (proc.Length == 1);
    }
  }
}

以下の値は、拡張子なしの EXE名でした。

Process.GetCurrentProcess().ProcessName

同じプロセス(EXE名)が実行中の場合に、後から起動したプロセスを終了する動きになります。

Mutexとの比較

今回の方法

EXE の名前(プロセス名)を変えると、同じアプリが起動できてしまいます。

Mutexを使う方法

アプリで任意の文字列を設定して、二重起動を禁止することができます。ただし、クローズ処理などが必要になります。

EXEを連打した場合

今回のアプリを連打して、二つ目のプロセスをすぐに起動するケースも試してみました。

自分の PC だと、二重起動は抑止されていました。