如何获得隐藏的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#处理完成而终止(除非你非常迂腐地确保你释放每一个明确使用的对象的引用)。