如何获取正在运行进程的ExitCode

7
我正在编写一个检查另一个应用程序退出代码的应用程序。我正在使用Process.GetProcessesByName来检查我要监视的应用程序是否已经在运行。如果它已经在运行,我会在调用WaitForExit后检查退出代码,但是当我这样做时,我会得到一个异常:

"此对象没有启动该进程,因此无法确定请求的信息。"

如果我启动该进程(如果它尚未运行),那么就不会出现此异常。

(Windows 8.1)

那么,在没有启动进程的情况下,如何找出ExitCode是多少?我想到的唯一选择是在退出时将输出代码写入文本文件并读取它……

1个回答

12

在将EnableRaisingEvents属性设置为true后,System.Diagnostics.Process会公开事件,您可以访问这些事件:

    int processId = 0; // TODO: populate this variable
    var proc = System.Diagnostics.Process.GetProcessById(processId);
    proc.EnableRaisingEvents = true;
    proc.Exited += ProcessEnded;

事件处理程序:

    private void ProcessEnded(object sender, EventArgs e)
    {
        var process = sender as Process;
        if (process != null)
        {
            var test = process.ExitCode;
        }
    }

变量test现在包含退出代码。

测试于Windows 8.1


谢谢伙计!你知道为什么你的方法能够工作,但是我的方法调用proc.WaitForExit()然后获取proc.ExitCode却会抛出异常吗? - joonas.fi
一个可能的原因是您没有进程句柄。当操作系统终止进程并且看不到进程句柄时,它将清除进程数据 - 当您的程序执行 WaitForExit 之后,退出代码将不再有效。http://msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx 中的备注部分讨论了使用句柄访问进程信息的问题。我认为您可能需要在进程退出之前设置该句柄。 - Amadeusz Wieczorek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接