我有一个Microsoft.Office.Interop.Excel.Application
的实例。为了确保EXCEL.EXE
进程及时死亡,我需要找到创建Application
对象时实例化的 ProcessID。
当 Excel Application
有一个窗口时,我找到了这方面的示例。
有没有办法为"隐藏"实例做到这一点,即当没有绑定到EXCEL.EXE
进程的窗口时,即未设置excelApp.Hwnd
时?
Application.Hwnd
具有有效的窗口句柄,即使应用程序没有可见的工作簿窗口,也可以使用该句柄获取关联的 Excel 应用程序的进程。
[DllImport("user32.dll")]
static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId);
Process GetExcelProcess(Microsoft.Office.Interop.Excel.Application excelApp)
{
int id;
GetWindowThreadProcessId(excelApp.Hwnd, out id);
return Process.GetProcessById(id);
}
void TerminateExcelProcess(Microsoft.Office.Interop.Excel.Application excelApp)
{
var process = GetExcelProcess(excelApp);
if (process != null)
{
process.Kill();
}
}
private void button1_Click(object sender, EventArgs e)
{
// Create Instance of Excel
Microsoft.Office.Interop.Excel.Application oXL = new Microsoft.Office.Interop.Excel.Application();
try
{
// Work with oXL
}
finally
{
TerminateExcelProcess(oXL);
}
}
注意:这个问题有一些答案,可以解释为什么当您通过自动化从 C# 完成对 Excel 进程的使用时,Excel 进程不会终止(除非您非常迂腐地确保释放对显式使用的任何对象的每个引用)。