在我的应用程序中,我打开一个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后删除文件,我会收到异常“文件已被另一个进程使用”。
有没有人可以帮我解决如何实现我的目标,或者告诉我为什么没有调用流程退出事件的原因?
答案 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();
}
这样事件是在系统试图摆脱之前注册的吗?