如何获取隐藏的 Excel 应用程序实例的进程 ID (PID)



我有一个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 进程不会终止(除非您非常迂腐地确保释放对显式使用的任何对象的每个引用)。

最新更新