C# 如何停止一个进程多次运行

C# 如何停止一个进程多次运行,c#,winforms,C#,Winforms,我正在开发我的Windows窗体应用程序。我使用以下代码在按钮单击事件上启动计算器进程: System.Diagnostics.Process.Start("calc.exe"); 如果我再次单击该按钮,将启动另一个计算器进程。那么,如何停止进程多次运行呢 谢谢轻松。。。禁用按钮,直到进程结束。当然,你也可以加入一些逻辑: if(!myProcess.HasExited) { alert("You've already started the calculator app."); } el

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

System.Diagnostics.Process.Start("calc.exe");
如果我再次单击该按钮,将启动另一个计算器进程。那么,如何停止进程多次运行呢


谢谢

轻松。。。禁用按钮,直到进程结束。当然,你也可以加入一些逻辑:

if(!myProcess.HasExited)
{
  alert("You've already started the calculator app.");
}
else
{
  // start the process
}
就我个人而言,我喜欢前者。只需设置一个事件处理程序并设置:

Process.EnableRaisingEvents = true;
事件处理程序将被触发,让您的程序知道计算器应用程序何时退出,以便它可以重新启用按钮


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

一种明智的方法是启动流程并跟踪流程。退出事件。像这样:

    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;
    }

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

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");
更新

 //If calc.exe or Calculator.exe not exist then start the calculator 
if (!IsProcessOpen("calc")|| !IsProcessOpen("Calculator"))
System.Diagnostics.Process.Start("calc.exe");
较新版本的Windows中的calculator进程被替换为calculator.exe如果尝试使用calc.exe检查进程是否存在,则始终会失败。您需要同时检查calc和calculator。 这是屏幕截图

代码

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

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

您可以通过在应用程序启动时创建互斥来实现这一点,方法如下:

 bool mine = false;
 Mutex mutex = new Mutex(true, "Something to identify this", out mine);
 if (!mine)
   // Application is already running
如果应用程序再次启动,互斥锁将已经存在,然后您可以使用SendMessage对初始应用程序进行激活


这方面的一个例子是。

您可以检查calc.exe的运行实例,阅读此>有三种常用方法。瑜珈修行者指给你们看的互斥音箱,克里斯·盖斯勒暗指的任何一种和谐的等待接近。对已经运行的进程的另一项检查将查找calc.exe的任何实例,并查找由任何其他可能不合适的prgram运行的calc。