【发布时间】:2014-11-07 08:16:08
【问题描述】:
问题是如何跟踪我从应用程序启动的进程。
我正在做一个“启动器”,我想跟踪我启动的程序何时关闭。
我检查了这些链接,但我认为这与我尝试的不完全相同,因为我将启动的进程都是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?),但没有成功
更新二:
我修改了代码,以便在任务中启动该过程。在这种情况下,会引发事件。是什么原因?
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();
});
}
【问题讨论】:
-
您是否保留了对您创建的
proc对象的引用? -
没有。该对象是在双击事件中创建的。
-
我认为问题在于当您退出您提到的代码块时,您对
proc的引用松散了,并且它被垃圾收集了。尝试从您的块中定义您的proc并检查结果