如何获得隐藏的Excel应用程序实例的ProcessID(PID)

我有一个Microsoft.Office.Interop.Excel.Application的实例。 为了确保EXCEL.EXE进程及时死亡,我需要find创buildApplication对象时实例化的ProcessID。

Excel Application有一个窗口时,我find了这样的示例 。

有没有办法做到这一点“隐藏”的实例,即当没有窗口绑定到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); } } 

注意:这个问题有一些答案,解释了为什么Excel过程不会因为通过自动化从C#处理完成而终止(除非你非常迂腐地确保你释放每一个明确使用的对象的引用)。