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