C# 是否未引发进程的已退出事件?

C# 是否未引发进程的已退出事件?,c#,C#,在我的应用程序中,我打开一个excel工作表,向用户显示我的一个excel文档。但在显示excel之前,我将其保存到本地计算机中的一个文件夹中,该文件夹实际上将用于显示 当用户关闭应用程序时,我希望关闭打开的excel文件并删除本地文件夹中的所有excel文件。为此,在注销事件中,我编写了关闭所有打开文件的代码,如下所示 Process[] processes = Process.GetProcessesByName(fileType); foreach (Pr

在我的应用程序中,我打开一个excel工作表,向用户显示我的一个excel文档。但在显示excel之前,我将其保存到本地计算机中的一个文件夹中,该文件夹实际上将用于显示

当用户关闭应用程序时,我希望关闭打开的excel文件并删除本地文件夹中的所有excel文件。为此,在注销事件中,我编写了关闭所有打开文件的代码,如下所示

Process[] processes = Process.GetProcessesByName(fileType);

                foreach (Process p in processes)
                {

                    IntPtr pFoundWindow = p.MainWindowHandle;
                    if (p.MainWindowTitle.Contains(documentName))
                    {
                        p.CloseMainWindow();
                        p.Exited += new EventHandler(p_Exited);                            
                    }                       
                }
在processexited事件中,我希望删除进程已退出的excel文件,如下所示

void p_Exited(object sender, EventArgs e)
    {
        string file = strOriginalPath;
        if (File.Exists(file))
        {
            //Pdf issue fix
            FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
            fs.Flush();
            fs.Close();
            fs.Dispose();
            File.Delete(file);
        }
    }
但问题是根本不调用此已退出事件。另一方面,如果在关闭进程的主窗口后删除该文件,则会出现异常“文件已被另一进程使用”


您是否可以帮助我实现我的目标,或者给我一个不调用进程退出事件的原因?

您是否尝试颠倒这两行:

if (p.MainWindowTitle.Contains(documentName))
{
    p.Exited += new EventHandler(p_Exited); 
    p.CloseMainWindow();                           
}

这样,在系统试图清除事件之前就注册了事件?

您的代码不太可能找到合适的窗口。Excel是一个单实例应用程序,如果您多次启动,它将为每个电子表格打开其他窗口。您至少必须通过调用EnumWindows并使用GetWindowText获取其标题来迭代它打开的窗口。

您应该尝试Dynamici的建议,但您可能还需要设置Process.EnableRaisingEvents=true

Process[] processes = Process.GetProcessesByName(fileType);

foreach (Process p in processes)
{
    IntPtr pFoundWindow = p.MainWindowHandle;
    if (p.MainWindowTitle.Contains(documentName))
    {
        p.EnableRaisingEvents = true;
        p.Exited += new EventHandler(p_Exited);
        p.CloseMainWindow();
    }                       
}

我其实是在调查这件事。您是否知道,即使使用
启用RaisingEvents
也可以将其提升到
false
?显然,在关闭操作后访问
进程.hasExit
将触发在
进程.Exit
上注册的事件。