ホームに戻る
関連 :
排他制御 WPFのエントリポイント [Win32]DLLのエントリポイント
目次 :

アプリケーションを多重起動させなくする手順

同一アプリケーションの多重起動を抑止する方法は複数存在するが、ここではセマフォを用いる手順を紹介する。
Visual Studioの旧バージョンでは、プロジェクトの設定から「複数インスタンスを作成しない」ようにすることができたが、2022版では不可能となっている。
(プロジェクトファイルを直接編集すれば可能かもしれないが、詳細は不明。)

セマフォによる多重起動抑止(WPF + C#)

Main() メソッドを編集する。
Main() メソッドを編集可能とするための手順はここを参照のこと。

(App.xaml.cs)
using System; using System.Reflection; using System.Windows; namespace Console_ELP03; // App クラス public partial class App : Application { // アプリケーションのエントリポイント [STAThread] public static void Main() { // 多重起動防止に Semaphore を用いる using var semaphore = new System.Threading.Semaphore(1, 1, Assembly.GetExecutingAssembly().GetName().Name, //< セマフォオブジェクト名 : アプリケーションのアセンブリ名 out bool createdNew); // 作成失敗(他のプロセスが既にセマフォを作成していた) // エラーを表示して終了 if ( !createdNew ) { Util.MessageBoxFunc.ShowErrorMsgBox( "多重起動はできません。終了します。" ); return; } App app = new App(); app.InitializeComponent(); app.Run(); } }

解説

セマフォオブジェクト名を指定することで、プロセス間で共有できるシステムセマフォを作成できる。
ここではアセンブリ名をセマフォオブジェクト名に用いているため、同一のアプリケーションを起動しようとすると同名のセマフォを作成することになる。
out 変数 createdNew には、システムセマフォの作成成否が格納されるが、既に同名のセマフォが作成されている( = 同名のアプリケーションが起動している)場合は失敗( false )となるため、
多重起動かどうかの判定が可能である。