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