4

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

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

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

谢谢

4

4 回答 4

5

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

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

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

Process.EnableRaisingEvents = true;

将引发事件处理程序,让您的 proggy 知道计算器应用程序何时退出,以便它可以重新启用按钮。

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
}
于 2012-06-30T13:17:59.583 回答
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检查进程是否存在总是会失败,您需要同时检查 calc 和计算器。这是屏幕截图 更新

代码

 //If calc.exe or Calculator.exe not exist then start the calculator 
if (!IsProcessOpen("calc")|| !IsProcessOpen("Calculator"))
System.Diagnostics.Process.Start("calc.exe");
于 2012-07-01T09:41:00.157 回答
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;
    }
于 2012-06-30T13:30:29.123 回答
0

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

您可以通过在应用程序启动时创建 Mutex 来实现这一点,如下所示:

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

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

这是如何完成的一个例子是here

于 2012-07-02T06:21:48.210 回答