二重起動を禁止するにはどうすればいいのでしょうか?
ここに答えが書いてあります。
二重起動を禁止する – .NET Tips (VB.NET,C#…)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
[STAThread] static void Main() { //Mutex名を決める(必ずアプリケーション固有の文字列に変更すること!) string mutexName = "MyApplicationName"; //Mutex名の先頭に「Global\」を付けて、Global Mutexにする mutexName = "Global\\" + mutexName; //すべてのユーザーにフルコントロールを許可するMutexSecurityを作成する System.Security.AccessControl.MutexAccessRule rule = new System.Security.AccessControl.MutexAccessRule( new System.Security.Principal.SecurityIdentifier( System.Security.Principal.WellKnownSidType.WorldSid, null), System.Security.AccessControl.MutexRights.FullControl, System.Security.AccessControl.AccessControlType.Allow); System.Security.AccessControl.MutexSecurity mutexSecurity = new System.Security.AccessControl.MutexSecurity(); mutexSecurity.AddAccessRule(rule); //Mutexオブジェクトを作成する bool createdNew; System.Threading.Mutex mutex = new System.Threading.Mutex(false, mutexName, out createdNew, mutexSecurity); //ミューテックスの初期所有権が付与されたか調べる if (createdNew == false) { //されなかった場合は、すでに起動していると判断して終了 MessageBox.Show("多重起動はできません。"); mutex.Close(); return; } try { //はじめからMainメソッドにあったコードを実行 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } finally { //ミューテックスを解放する mutex.ReleaseMutex(); mutex.Close(); } } |
これで二重起動を防ぐことができるのですが、なぜ二重起動を防がないといけないのでしょうか? 編集中のファイルを二重に開いてしまわないようにするためではないのでしょうか?
そこで同じファイルを開かないのであれば二重起動は許可するということにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
static class Program { static public System.Threading.Mutex mutex = null; /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { string[] files = System.Environment.GetCommandLineArgs(); bool IsArrowStart; if (files.Length > 1) { IsArrowStart = !IsDoublestarts(files[1], out mutex); if (!IsArrowStart) { MessageBox.Show("二重起動はできません", "", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } try { //はじめからMainメソッドにあったコードを実行 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } finally { //ミューテックスを解放する if (mutex != null) { mutex.ReleaseMutex(); mutex.Close(); } } } static public bool IsDoublestarts(string path, out System.Threading.Mutex mutex) { //Mutex名はアプリケーションのパスと編集されているファイルのパスとする) string mutexName = Application.ExecutablePath; mutexName += path; mutexName = mutexName.Replace("\\", "_"); // \は使用不可なので置き換える mutexName = "Global\\" + mutexName; if (mutexName.Length >= 260) mutexName = mutexName.Substring(0, 259); System.Security.AccessControl.MutexAccessRule rule = new System.Security.AccessControl.MutexAccessRule( new System.Security.Principal.SecurityIdentifier( System.Security.Principal.WellKnownSidType.WorldSid, null), System.Security.AccessControl.MutexRights.FullControl, System.Security.AccessControl.AccessControlType.Allow); System.Security.AccessControl.MutexSecurity mutexSecurity = new System.Security.AccessControl.MutexSecurity(); mutexSecurity.AddAccessRule(rule); bool createdNew; mutex = new System.Threading.Mutex(true, mutexName, out createdNew); if (createdNew == false) { mutex.Close(); return true; } else { return false; } } } |
Mutex名はアプリケーション固有の文字列にしないといけないので、アプリケーション実行ファイルのパスと編集されているファイルのパス名を連結したものにしました。ただし260文字を超えてはいけません。
System.Environment.GetCommandLineArgs()が返す配列の長さが1の場合はファイルがダブルクリックされたり、ドラッグ&ドロップされた場合ではないので、なにもせずそのまま起動しています。System.Environment.GetCommandLineArgs()が返す配列の長さが2以上の場合はProgram.IsDoublestartsを呼び出して本当に開いていいかを判断しています。
ファイルを開くときや保存するときも、Program.IsDoublestartsをつかって二重起動にならないようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public partial class Form1 : Form { void OpenFile() { OpenFileDialog open = new OpenFileDialog(); open.Filter = "trtファイル|*.trt"; if (open.ShowDialog() == DialogResult.OK) { System.Threading.Mutex mutex; bool IsAllowOpen = ! Program.IsDoublestarts(open.FileName, out mutex); if (!IsAllowOpen) { MessageBox.Show("二重起動はできません", "", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (Program.mutex != null) { mutex.ReleaseMutex(); mutex.Close(); } // あとはファイルを開くための処理 } void SaveAsFile() { // ファイルが保存の準備(省略) if (save.ShowDialog() == DialogResult.OK) { // ファイルが保存されたあと・・・ if (Program.mutex != null) { Program.mutex.ReleaseMutex(); Program.mutex.Close(); } System.Threading.Mutex mutex; Program.IsDoublestarts(save.FileName, out mutex); } } } |