如何阻止进程多次运行

时间:2012-06-30 13:10:47

标签: c# winforms

我正在使用我的Windows窗体应用程序。我使用以下代码在按钮单击事件上启动计算器进程:

System.Diagnostics.Process.Start("calc.exe");

如果再次单击该按钮,则会启动另一个计算器进程。那么如何阻止该进程多次运行呢?

由于

4 个答案:

答案 0 :(得分:5)

简单...禁用按钮,直到进程终止。当然,你也可以提出某种逻辑:

if(!myProcess.HasExited)
{
  alert("You've already started the calculator app.");
}
else
{
  // start the process
}

就个人而言,我喜欢前者。只需设置一个事件处理程序并设置:

Process.EnableRaisingEvents = true;

当计算器应用程序退出时,将提升事件处理程序,让你的程序知道,这样它就可以重新启用按钮。

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.enableraisingevents.aspx

try
{
    myProcess.EnableRaisingEvents = true;
    myProcess.Exited += new EventHandler(myProcess_Exited);
    myProcess.Start();
    // disable button
}
catch()
{
    // enable button
}


private void myProcess_Exited(object sender, System.EventArgs e)
{
    // enable button
}

答案 1 :(得分:3)

使其变得简单,创建一个函数来检查是否有任何进程正在运行:

public bool IsProcessOpen(string name)
{
foreach (Process process in Process.GetProcesses())
{
if (process.ProcessName.Contains(name))
{
return true;
}
}
return false;
}

现在使用此功能来检查过程:

if (!IsProcessOpen("calc"))
 System.Diagnostics.Process.Start("calc.exe");

<强>更新

新版本Windows中的计算器进程被 Calculator.exe 替换,您尝试使用 calc.exe 检查进程是否存在将始终无法检查对于计算和计算器。 这是屏幕截图 Update

<强>代码

 //If calc.exe or Calculator.exe not exist then start the calculator 
if (!IsProcessOpen("calc")|| !IsProcessOpen("Calculator"))
System.Diagnostics.Process.Start("calc.exe");

答案 2 :(得分:2)

您可以使用Process.GetProcessesByName()来发现名为“calc.exe”的任何正在运行的进程。然而,这是不可靠的,流程名称并不明确。可能存在完全不同的具有相同.exe名称的进程。

理智的方法是启动流程并使用Process.Exited事件跟踪它。像这样:

    Process calc;

    private void button1_Click(object sender, EventArgs e) {
        if (calc != null) return;
        calc = new Process();
        calc.StartInfo = new ProcessStartInfo("calc.exe");
        calc.EnableRaisingEvents = true;
        calc.Exited += new EventHandler(calc_Exited);
        calc.SynchronizingObject = this;
        calc.Start();
        button1.Enabled = false;
    }

    void calc_Exited(object sender, EventArgs e) {
        calc.Exited -= calc_Exited;
        calc = null;
        button1.Enabled = true;
    }

答案 3 :(得分:0)

通常,当您执行此操作时,您希望将控制权转移到应用程序的第一个实例,以便它可以自行激活。否则启动应用程序的人不知道发生了什么,并将继续启动它。

您可以通过在应用程序启动时创建互斥锁来实现此目的,方法如下:

 bool mine = false;
 Mutex mutex = new Mutex(true, "Something to identify this", out mine);
 if (!mine)
   // Application is already running

如果应用程序第二次启动,则Mutex已经存在,然后您可以将SendMessage用于初始应用程序以使其自行激活。

如何做到这一点的一个例子是here

相关问题