可能な重複:
シングルインスタンスアプリケーションを作成する正しい方法は何ですか?
ユーザーが新しいインスタンスを開こうとすると、すでに開いているアプリケーションに戻る
プログラムの別のインスタンス(たとえば、test.exe)が実行されているかどうかを確認し、そのインスタンスが存在する場合、アプリケーションの読み込みを停止する方法を誰かに示すことができますか。
本格的なコードが必要ですか?ここにあります。
_var exists = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1;
_
これは任意のアプリケーション(任意の名前)で機能し、anotherインスタンス実行中のtrue
になります同じアプリケーション。
編集:ニーズを修正するには、次のいずれかを使用できます。
_if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) return;
_
mainメソッドからメソッドを終了します...または
_if (System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count() > 1) System.Diagnostics.Process.GetCurrentProcess().Kill();
_
現在ロード中のプロセスを即座に強制終了します。
.Count()
extension methodのSystem.Core.dllへの参照を追加する必要があります。または、_.Length
_プロパティを使用できます。
「プログラム」の意味はわかりませんが、アプリケーションを1つのインスタンスに制限する場合は、Mutexを使用して、アプリケーションがまだ実行されていないことを確認できます。
[STAThread]
static void Main()
{
Mutex mutex = new System.Threading.Mutex(false, "MyUniqueMutexName");
try
{
if (mutex.WaitOne(0, false))
{
// Run the application
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
else
{
MessageBox.Show("An instance of the application is already running.");
}
}
finally
{
if (mutex != null)
{
mutex.Close();
mutex = null;
}
}
}
良いサンプルアプリケーションを次に示します。以下は可能な方法の1つです。
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (current.ProcessName);
//Loop through the running processes in with the same name
foreach (Process process in processes)
{
//Ignore the current process
if (process.Id != current.Id)
{
//Make sure that the process is running from the exe file.
if (Assembly.GetExecutingAssembly().Location.
Replace("/", "\\") == current.MainModule.FileName)
{
//Return the other process instance.
return process;
}
}
}
//No other instance was found, return null.
return null;
}
if (MainForm.RunningInstance() != null)
{
MessageBox.Show("Duplicate Instance");
//TODO:
//Your application logic for duplicate
//instances would go here.
}
他の多くの可能な方法。代替案については例を参照してください。
編集1:ちょうどあなたがコンソールアプリケーションを持っているというあなたのコメントを見ました。 2番目のサンプル
これを試すことができます
Process[] processes = Process.GetProcessesByName("processname");
foreach (Process p in processes)
{
IntPtr pFoundWindow = p.MainWindowHandle;
// Do something with the handle...
//
}
Process静的クラスには、実行中のプロセスを検索するために使用できるメソッドGetProcessesByName()があります。同じ実行可能ファイル名で他のプロセスを検索するだけです。