web-dev-qa-db-ja.com

アプリケーションの別のインスタンスが実行されているかどうかを確認する方法

可能な重複:
シングルインスタンスアプリケーションを作成する正しい方法は何ですか?
ユーザーが新しいインスタンスを開こうとすると、すでに開いているアプリケーションに戻る

プログラムの別のインスタンス(たとえば、test.exe)が実行されているかどうかを確認し、そのインスタンスが存在する場合、アプリケーションの読み込みを停止する方法を誰かに示すことができますか。

39
Tom

本格的なコードが必要ですか?ここにあります。

_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 methodSystem.Core.dllへの参照を追加する必要があります。または、_.Length_プロパティを使用できます。

112
Vercas

「プログラム」の意味はわかりませんが、アプリケーションを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;
        }
    }
}
55
Patrik Svensson

良いサンプルアプリケーションを次に示します。以下は可能な方法の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.
}

他の多くの可能な方法。代替案については例を参照してください。

最初のもの

2番目のもの

サードワン

編集1:ちょうどあなたがコンソールアプリケーションを持っているというあなたのコメントを見ました。 2番目のサンプル

13
CharithJ

これを試すことができます

Process[] processes = Process.GetProcessesByName("processname");
foreach (Process p in processes)
{
    IntPtr pFoundWindow = p.MainWindowHandle;
    // Do something with the handle...
    //
}
0
R Quijano

Process静的クラスには、実行中のプロセスを検索するために使用できるメソッドGetProcessesByName()があります。同じ実行可能ファイル名で他のプロセスを検索するだけです。

0
KeithS