我正在使用我的Windows窗体应用程序。我使用以下代码在按钮单击事件上启动计算器进程:
System.Diagnostics.Process.Start("calc.exe");
如果再次单击该按钮,则会启动另一个计算器进程。那么如何阻止该进程多次运行呢?
由于
答案 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 检查进程是否存在将始终无法检查对于计算和计算器。 这是屏幕截图
<强>代码强>
//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。