Хорошо, я даже не пробовал это, поэтому я не уверен, что это будет работать, но вы можете попробовать что-то вроде этого:
Microsoft.Office.Interop.Excel.Application excel = ...;
System.Diagnostics.Process excelProcess = null;
var processes = System.Diagnostics.Process.GetProcesses();
foreach (var process in processes)
{
if (process.Handle.ToInt32() == excel.Hwnd)
excelProcess = process;
}
excelProcess.Exited += new EventHandler(excelProcess_Exited);
ОБНОВЛЕНИЕ
Попробуйте следующий код (это не красиво):
Microsoft.Office.Interop.Excel.Application xlsApp;
Process xlsProcess;
Timer timer;
public Form1()
{
xlsApp = new Microsoft.Office.Interop.Excel.Application();
xlsApp.Visible = true;
foreach (var p in Process.GetProcesses()) //Get the relevant Excel process.
{
if (p.MainWindowHandle == new IntPtr(xlsApp.Hwnd))
{
xlsProcess = p;
break;
}
}
if (xlsProcess != null)
{
timer = new Timer();
timer.Interval = 500;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
}
void timer_Tick(object sender, EventArgs e)
{
if (xlsApp != null && !xlsApp.Visible)
{
//Clean up to make sure the background Excel process is terminated.
xlsApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp);
xlsApp = null;
}
if (xlsProcess.HasExited)
{
//The event is not fired but the property is eventually set once the process is terminated
this.timer.Dispose();
this.Close();
}
}
Проблема при работе с приложением Excel заключается в том, что даже если пользователь закрывает свое главное окно, процесс будет продолжаться вфон.Чтобы полностью освободить его, вы должны позвонить Application.Quit
, но вы должны делать это только тогда, когда обнаруживаете, что пользователь закрывает окно, что является именно той проблемой, которую вы пытаетесь решить ... у вас есть круговая ссылка здесь: D
Скорее всего, фиксация на соответствующем System.Diagnostics.Process
тоже не работает, так как событие Exited
никогда не запускается (даже если вы завершаете фоновый процесс из диспетчера задач).Я предполагаю, что это событие запускается только с процессами, запущенными через process = Process.Start(...)
.
Так что единственное решение, которое я вижу, это опрос, если главное окно Excel видно.Если это не так, это, вероятно, означает, что пользователь закрыл главное окно, и приложение Excel должно быть закрыто (если есть сценарий, когда видимость главного окна Excel может быть ложной, кроме случаев, когда пользователь хочет прекратить процесс, тогда это решение не являетсядействует).Оттуда это довольно просто.