[OK]を、私はそうであっても、これを試していない私はそれが動作するかどうかわからないんだけど、あなたはこれらの線に沿って何かを試みることができる:
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);
UPDATE
は、以下のことを試してみてくださいコード:(それほど美味しくはない):
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アプリケーションで作業するときの問題は、ユーザーがメインウィンドウを閉じても、 ocessはバックグラウンドで実行し続けます。完全に解放するためには、Application.Quit
に電話をしなければなりませんが、あなたが解決しようとしている問題であるウィンドウを閉じているユーザーを検出したときにのみ行うべきです...ここで循環参照があります:D
関連するSystem.Diagnostics.Process
へのラッチは、Exited
イベントが発生しないため、(タスクマネージャからバックグラウンドプロセスを終了しても)動作しないため、どちらも機能していないようです。私の推測では、このイベントは、process = Process.Start(...)
によって起動されたプロセスでのみ発生するということです。
私が見ることができる唯一の解決策は、Excelのメインウィンドウが表示されている場合にポーリングすることです。それがないと、ユーザーがメインウィンドウを閉じ、Excelアプリケーションを終了する必要があることを意味します(Excelのメインウィンドウの可視性は、ユーザーがプロセスを終了するとき以外は間違っている場合があります有効)。そこからはかなり簡単です。
実行中のプロセスをポーリングして、Excelプロセスが終了すると終了しますか? – CodingBarfield
Visual Studio 2008または2010を使用している場合、フォームを完全にバイパスしてExcel Addinを作成することができます - http://msdn.microsoft.com/en-us/library/cc668205.aspx – JMK
私のアプリケーションのポイント。私はこのようにする必要があります。私が知らないのは、C#のインスタンス化されたアプリケーションが終了しているときにC#アプリケーションを閉じることになるリスナーを設定する方法です。 – Jsncrdnl