问题是如何跟踪我从应用程序开始的流程。
我正在做一个“启动器”,我想跟踪我启动的程序何时关闭。
我检查了这些链接,但我认为这与我正在尝试的完全相同,因为我将启动的流程都是javaw.exe
,我需要单独处理它们。
How to detect a process start & end using c# in windows?
这就是代码现在的样子:
{
Process proc = new Process();
proc.Exited += EclipseInstanceClosed;
proc.Disposed += EclipseInstanceDisposed;
// this property is a *.exe path: 'C:\eclipse\eclipseV4.4.1\eclipse.exe' for example
proc.StartInfo.FileName = SelectedEclipseInstance.Exec;
proc.StartInfo.UseShellExecute = true;
proc.Start();
}
...
void EclipseInstanceClosed(object sender, EventArgs e)
{
MessageBox.Show("Eclipse was closed!");
}
void EclipseInstanceDisposed(object sender, EventArgs e)
{
MessageBox.Show("Eclipse was disposed!");
}
但是当我关闭程序时,不会引发这些事件。
有什么想法吗?
更新
我还尝试使用proc.EnableRaisingEvents = true;
此解决方案(why Process's Exited method not being called?),但没有成功
更新II:
我修改了代码,以便在Task中启动进程。在这种情况下,事件被提出。是什么原因?
LaunchEclipseProcess();
...
private async void LaunchEclipseProcess()
{
await Task.Run(() =>
{
Process proc = new Process();
proc.EnableRaisingEvents = true;
proc.StartInfo.UseShellExecute = true;
proc.Exited += EclipseInstanceClosed;
proc.Disposed += EclipseInstanceDisposed;
proc.StartInfo.FileName = SelectedEclipseInstance.Exec;
proc.Start();
});
}
答案 0 :(得分:0)
你试过吗
proc.WaitForExit()
如果您需要其余代码继续执行并在完成后运行EclipseInstanceClosed方法,您甚至可以在另一个线程上运行proc.WaitForExit()。
如果进程实际已停止,则此方法将返回。如果它永远不会返回,则意味着该过程从未停止过。然后你需要解决为什么它不会停止。
在启动应用程序的第一个实例之前,获取所有正在运行的Javaw.exe及其PID的列表。保留此列表。 启动应用程序的新实例后,请重新检查javaw.exe列表。找到新的。为此流程创建一个“参考”,以便像上面编写代码一样对其进行监控。
var proc = Process.GetProcessById(id);
继续监控并做你的事情。
如果您启动新流程,请重做上面的逻辑。在之前和之后列出所有javaw.exe以使您的Process.Id进行监控。
如果使用参数运行每个javaw.exe,如果上述方法不够好,还有办法获取这些参数以缩小目标进程的范围。
答案 1 :(得分:0)
proc.Exited += EclipseInstanceClosed;
请注意,上述代码不会在启动的应用程序关闭时通知。 process.Exited事件用于了解关联进程何时完成(通过调用Process.Start()触发的进程)。但是,如果要检查启动的应用程序是否正在运行/关闭,您可以在EclipseInstanceClosed事件中编写一些监视代码,如下所示。
void EclipseInstanceClosed(object sender, EventArgs e)
{
while (true)
{
Process runningEclipseProcess = Process.GetProcessesByName("ExclipeProcessName").FirstOrDefault();
if (runningEclipseProcess != null)
{
//Exclipe is not closed. Wait for 1 sec and check again.
Thread.Sleep(1000);
}
else
{
//Exclipe is closed. Notify the user
MessageBox.Show("Eclipse was closed!");
break;
}
}
}