退出事件的过程没有被提出?

时间:2010-03-17 15:11:55

标签: c#

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

当用户关闭应用程序时,我希望关闭打开的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);                            
                    }                       
                }

在流程退出事件中,我希望删除退出流程的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);
        }
    }

但问题是这个退出的事件根本没有被调用。另一方面,如果我在关闭进程的MainWindow后删除文件,我会收到异常“文件已被另一个进程使用”。

有没有人可以帮我解决如何实现我的目标,或者告诉我为什么没有调用流程退出事件的原因?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您应该尝试Dynami的建议,但您可能还需要设置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();
    }                       
}

答案 2 :(得分:1)

您是否试图扭转这两行:

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

这样事件是在系统试图摆脱之前注册的吗?